def counter(x):
def _cnt():
#nonlocal x
x = x+1
print(x)
return x
return _cnt
a = counter(0)
print(a())
上面的代码提供了以下错误Python的闭包
UnboundLocalError:局部变量“X”分配
这是为什么没能在创造与价值“X + 1”的新对象之前引用_cnt的命名空间并将其绑定到x。我们将在两个函数名称空间中都有引用x
我认为像'x = x + 1'这样的赋值语句是这样执行的。评估第一个表达式x + 1(所以x指的是计数器的x),然后将表达式的返回值赋给x(这应该在_cnt的命名空间中创建一个新的引用 – user634615
正如您在第二个示例中所见,尽快因为你分配了一个名字,所有对它的引用都变成本地的,不管它们是在赋值之前还是之后发生的。 – Hyperboreus
@ user634615我加了反汇编,'LOAD_FAST'是失败的。 – Hyperboreus