考虑这个函数:
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
列表似乎在内部函数范围内,而值不在。为什么会发生这种情况?
@rassar清楚地解释了原因。这里我给出一个解决方案:
def j():
x = 1
def f():
nonlocal x
x += 1
print(x)
pass
return f
其实这不是一个简单的问题。即使+=
看起来像一个有界方法调用,也是一个就地操作(如果您有其他语言的经验(。但运行的是类似于x = x.__add__(1)
或x = x.__iadd__(1)
的东西。所以这是一项任务。
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
因为,python编译器知道函数f中的变量'x'是一个局部变量,而不是函数j中的变量。所以发生了上面提到的错误。
所以你应该使用非本地。请参阅下面的链接。访问父函数';使用python 在父函数中调用的子函数中的s变量