2010-02-18 93 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()