蟒蛇:如何捕捉在非全局的祖先外范围内声明的变量?(python: How do I capture

2019-06-23 21:00发布

鉴于:

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

Answer 1:

你可以让x一个功能属性 :

def f():
    f.x = 0
    def g():
        h()
    def h():
        f.x += 1
        print(f.x)
    g()

此外,由于Python 3里,你可以使用nonlocal关键字。



Answer 2:

如果你正在使用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()


Answer 3:

在Python 3只使用nonlocal

def f():
    x = 0
    def g():
        h()
    def h():
        nonlocal x
        x += 1
        print(x)
    g()
f()


Answer 4:

我们不能把x作为函数的参数作为解决方法

def f():
    x = 0
    def g():
        h(x)
    def h(x):
        x += 1
        print(x)
    g()

f() 


Answer 5:

最简单的就是使用字典或空类,如:

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?
标签: python scope