[英]Python closures
def counter(x):
def _cnt():
#nonlocal x
x = x+1
print(x)
return x
return _cnt
a = counter(0)
print(a())
上面的代码给出了以下错误
UnboundLocalError:赋值前引用的局部变量'x'
为什么这不能在_cnt的命名空间中创建值为'x + 1'的新对象并将其绑定到x。 我们将在两个函数名称空间中引用x
只要分配给定范围内的名称,同一范围内对同一名称的所有引用都是本地的。 因此,无法评估x + 1
(因为它试图引用本地x
)。
因此这有效:
def f():
x = 42
def g():
print(x)
g()
f()
但这不是:
def f():
x = 42
def g():
print(x)
x = 42
g()
f()
第一个print
有这个字节码:
0 LOAD_GLOBAL 0 (print)
3 LOAD_DEREF 0 (x)
6 CALL_FUNCTION 1
9 POP_TOP
而第二个print
有这个:
0 LOAD_GLOBAL 0 (print)
3 LOAD_FAST 0 (x)
6 CALL_FUNCTION 1
9 POP_TOP
函数counter
和_cnt
的范围不一样。 即使它们是嵌套的,也没关系。
所以_cnt
中不存在counter
中的x
。 也许把它作为一个论点传递(或者使用nonlocal
,正如你似乎已经理解的那样)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.