Python的关闭 - 在赋值之前引用的局部变量
问题描述:
我想了解在Python中闭包的工作原理。Python的关闭 - 在赋值之前引用的局部变量
我觉得像add1应该在这里工作得很好。我期望在调用helper
时定义变量x
。但是,它给我一个Local variable referenced before assignment
错误。
add2
与add1
非常相似。它不是用一个整数赋值x,而是用一个字典赋值。它的行为也与我期望的一致。 x
在helper
内定义和引用。
import random
def add1():
x = 0
def helper():
x = x + 1
return x
return helper
def add2():
x = {}
def helper():
x[random.randint(1,1000)] = 3
return x
return helper
if __name__ == '__main__':
a1 = add1()
a2 = add2()
# print(a1()) #This causes error
print(a2()) #{650: 3}
print(a2()) #{650: 3, 333: 3}
这是什么逻辑?除了x
的类型不同之外,我还有什么不同?
答
您期待编译器知道该变量已被绑定在闭包之外。这是不正确的,因此您需要使用nonlocal
来表明这一点。
def add1():
x = 0
def helper():
nonlocal x
x = x + 1
return x
return helper
编辑由丹尼斯:
nonlocal
不add2
必要的,因为它只是修改x
,而不是再结合它(又名不是重新分配它)。而在add1
,x= x+1
是re-assignment
。
顺便说一下,您正在返回函数引用 - 实际上并没有调用“helper”。 – TigerhawkT3
甚至改变这种情况,在后续调用'a2()'时不会获得额外的键/值对,因为每次都定义一个新的字典'x'。 – TigerhawkT3
@ TigerhawkT3你能否更详细地说明“这两个助手都没有真的叫过”?如果没有被调用,为什么调用'a2'每次都会为字典添加新的值? – denniss