在Python中从双重嵌套函数内部访问变量

5
以下代码:
x = 0
print "Initialization: ", x
def f1():
    x = 1
    print "In f1 before f2:", x
    def f2():
        global x
        x = 2
        print "In f2:          ", x
    f2()
    print "In f1 after f2: ", x
f1()
print "Final:          ", x

输出:

Initialization:  0
In f1 before f2: 1
In f2:           2
In f1 after f2:  1
Final:           2

有没有办法让f2访问f1的变量?

2
这是一件可怕的事情。你为什么要这样做?为什么不只是将f1变成一个可调用对象并正确共享实例变量呢? - S.Lott
我同意,这非常可怕,但我在想是否有可能。我希望没有人会把这样的东西发布到公众环境中。 - kzh
3个回答

6
在Python 3中,你可以在f2中将x定义为nonlocal
在Python 2中,你无法直接在f2中将x分配给f1。但是,你可以读取它的值并访问其成员。所以这可能是一个解决方法:
def f1():
    x = [1]
    def f2():
        x[0] = 2
    f2()
    print x[0]
f1()

6
你可以访问变量,但问题是赋值。在Python 2中,没有办法将x重新绑定到新值。有关此问题,请参见PEP 227(嵌套作用域)。

在Python 3中,你可以使用新的nonlocal关键字代替global。请参见PEP 3104


0

移除 global 声明:

>>> x
0
>>> def f1():
    x = 1
    print(x)
    def f2():
        print(x)
    f2()
    print(x)


>>> f1()
1
1
1

如果你想要从函数f1中改变变量x,那么你需要在每个函数中使用global语句。

这将不允许你从f2分配给x。 - interjay
那已经被修复了,Interjay。然而,从问题中并不清楚OP想要分配给x。他说访问 - SilentGhost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接