17

鉴于:

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

4

5 回答 5

15

您可以创建x一个函数属性

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

此外,从 Python 3 开始,您可以使用nonlocal关键字。

于 2012-04-22T18:59:37.100 回答
7

如果您使用的是 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()
于 2012-04-22T18:58:38.130 回答
6

在 Python 3 中,只需使用nonlocal

def f():
    x = 0
    def g():
        h()
    def h():
        nonlocal x
        x += 1
        print(x)
    g()
f()
于 2012-04-22T19:01:05.940 回答
0

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

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

f() 
于 2013-01-23T05:32:41.080 回答
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

尽管已经提供了许多好的解决方案,但它们也有一些极端情况:

  • 根据 Ashwini,非本地仅是 Python 3.x
  • 函数属性,每个 ovgolovin,将失败是f被重新定义并稍后通过引用调用
于 2013-02-06T14:24:34.640 回答