我试图了解如何在Python中使用闭包。
我觉得add1应该在这里工作得很好。我希望在调用x
时定义变量helper
。但是,它给了我一个Local variable referenced before assignment
错误。
add2
与add1
非常相似。它不是用整数赋值x,而是用字典赋值。它的行为也符合我的预期。 x
内部helper
已定义并可引用。{/ p>
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
的类型不同之外,我在做什么?
答案 0 :(得分:11)
您期望编译器知道变量已绑定在闭包之外。事实并非如此,因此您需要使用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
。