鉴于:
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
你可以让x
一个功能属性 :
def f():
f.x = 0
def g():
h()
def h():
f.x += 1
print(f.x)
g()
此外,由于Python 3里,你可以使用nonlocal
关键字。
如果你正在使用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()
在Python 3只使用nonlocal
:
def f():
x = 0
def g():
h()
def h():
nonlocal x
x += 1
print(x)
g()
f()
我们不能把x
作为函数的参数作为解决方法
def f():
x = 0
def g():
h(x)
def h(x):
x += 1
print(x)
g()
f()
最简单的就是使用字典或空类,如:
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
虽然已经提出了许多好的解决方案,他们有个别案例:
- 外地,每阿什维尼,仅仅是Python的3.x的
- 功能属性,每ovgolovin,将失败是
f
被重新定义,后来由参考称为
文章来源: python: How do I capture a variable declared in a non global ancestral outer scope?