我正在使用Python中的闭包,我不明白为什么以下不起作用以及如何使其工作:
>>> def make_counter():
... i = 0
... def inner():
... i += 1
... return i
... return inner
...
>>> c = make_counter()
>>> c()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in inner
UnboundLocalError: local variable 'i' referenced before assignment
有人能说清楚吗? 感谢。
答案 0 :(得分:3)
在inner
函数中,语句
i += 1
可以像这样理解
i = i + 1
因为您在此函数中为i
赋值,所以Python认为您正在创建一个作用于此当前函数的新变量。然后,当它执行右侧表达式i + 1
时,它会发现i
在使用之前尚未分配任何值。这就是它投掷的原因
UnboundLocalError: local variable 'i' referenced before assignment
要解决此问题,您需要明确告诉Python您没有创建新变量,而是从外部作用域访问变量,使用nonlocal
(Python 3.x)这样
>>> def make_counter():
... i = 0
... def inner():
... nonlocal i
... i += 1
... return i
... return inner
...
>>>
>>> make_counter()()
1
注意:如果您使用的是Python 2.x,请按照this question
中提到的任何方法进行操作