问题描述
考虑此功能:
def g():
x = []
def f():
x.append([0])
print(x)
pass
return f
调用:
test = g()
test()
我得到以下输出:
Out: [[0]]
test = g()
for i in range(3):
test()
产生以下输出:
Out: [[0]]
[[0],[0]]
[[0],[0],[0]]
但是,定义以下功能:
def j():
x = 1
def f():
x += 1
print(x)
pass
return f
并调用它:
test = j()
test()
导致错误:
UnboundLocalError: local variable 'x' referenced before assignment
列表似乎在内部函数作用域中,而值不在。为什么会这样?
解决方法
这是因为j
使用赋值表达式,其中g
使用方法调用。请记住,x += 1
等效于x = x + 1
。如果您将g
更改为:
def g():
x = []
def f():
x += [[0]]
print(x)
pass
return f
您得到:
>>> test = g()
>>> test()
Traceback (most recent call last):
File "<pyshell#20>",line 1,in <module>
test()
File "<pyshell#18>",line 5,in f
x += [[0]]
UnboundLocalError: local variable 'x' referenced before assignment
,
@rassar清楚地解释了原因。在这里,我给出一个解决方案:
def j():
x = 1
def f():
nonlocal x
x += 1
print(x)
pass
return f
实际上,这不是一个简单的问题。即使+=
看起来像是一个有界方法调用,还是一个就地操作(如果您有其他语言的经验)。但是运行的是类似x = x.__add__(1)
或x = x.__iadd__(1)
的东西。这是一项任务。
因为,python编译器知道函数f中的变量'x'是局部变量,而不是函数j中的局部变量。因此发生了您上面提到的错误。
因此,您应该使用非本地。请参考下面的链接。 Accessing parent function's variable in a child function called in the parent using python