python:如何捕获在非全局祖先外部作用域中声明的变量?

时间:2012-04-22 18:47:55

标签: python scope

假设:

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

5 个答案:

答案 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

虽然已经提供了许多好的解决方案,但它们还有一些不足之处:

  • nonlocal,根据Ashwini,仅限Python 3.x
  • 函数属性,每个ovgolovin,将失败,f被重新定义,稍后通过引用调用