假设:
def f():
x = 0
def g():
h()
def h():
x += 1
print(x)
g()
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in f
File "<stdin>", line 4, in g
File "<stdin>", line 6, in h
UnboundLocalError: local variable 'x' referenced before assignment
>>>
如何让h
看到x
变量?
感谢。
修改
之前应该提到它,我使用的是Python 2.7.3
答案 0 :(得分:12)
您可以x
function attribute:
def f():
f.x = 0
def g():
h()
def h():
f.x += 1
print(f.x)
g()
此外,从Python 3开始,您可以使用nonlocal
关键字。
答案 1 :(得分:5)
如果您使用的是Python 3,则使用nonlocal
关键字。将nonlocal x
放在函数h
的开头。如果您使用的是Python 2.x,则解决方法是使x
列表中包含一个元素,因此您可以对其进行修改:
def f():
x = [0]
def g():
h()
def h():
x[0] += 1
print x[0]
g()
f()
答案 2 :(得分:5)
在Python 3中,只需使用nonlocal
:
def f():
x = 0
def g():
h()
def h():
nonlocal x
x += 1
print(x)
g()
f()
答案 3 :(得分:0)
我们不能将x
作为函数参数作为解决方法
def f():
x = 0
def g():
h(x)
def h(x):
x += 1
print(x)
g()
f()
答案 4 :(得分:0)
最简单的方法是使用dict或空类,例如:
class Empty:
x = 0
def f():
closure1 = dict(x=0)
closure2 = Empty()
def g(): h(x)
def h(x):
closure1["x"] += 1
closure2.x += 1
g()
print closure1["x"], closure2.x
虽然已经提供了许多好的解决方案,但它们还有一些不足之处:
f
被重新定义,稍后通过引用调用