2010-02-18 78 views
4

下面的代码:访问从变量中一个双重嵌套函数在Python

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'成为一个可调用的对象并正确共享实例变量? – 2010-02-18 18:48:57

+0

我同意,这是非常可怕的,但我想知道是否有可能。我希望没有人会在野外放置这样的东西。 – kzh 2010-02-19 14:26:43

回答

5

您可以访问变量,问题是分配。在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 
如果你想

变化变量xf1那么你需要使用global声明中的每个功能。

+0

这将不允许您从f2分配给x。 interjay的用法和样例: – interjay 2010-02-18 17:25:43

+0

。但是,从这个问题来看,OP并不清楚OP是否要分配给'x'。他说*访问*。 – SilentGhost 2010-02-18 17:27:11

5

在Python 3中,您可以在f2中将x定义为nonlocal

在Python 2中,您不能直接指定给f2的f1。但是,您可以阅读其价值并访问其成员。所以这可能是一个解决方法:

def f1(): 
    x = [1] 
    def f2(): 
     x[0] = 2 
    f2() 
    print x[0] 
f1()