Python封闭混乱

时间:2015-03-16 02:51:03

标签: python closures

我正在使用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

有人能说清楚吗? 感谢。

1 个答案:

答案 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

中提到的任何方法进行操作