2010-05-06 13 views
1

請參見下面的代碼:可變全局變量不會隱藏在python函數中,對吧?

def good(): 
    foo[0] = 9   # why this foo isn't local variable who hides the global one 

def bad(): 
    foo = [9, 2, 3] # foo is local, who hides the global one 

for func in [good, bad]: 
    foo = [1,2,3] 

    print('Before "{}": {}'.format(func.__name__, foo)) 
    func() 
    print('After "{}": {}'.format(func.__name__, foo)) 

結果如下:

# python3 foo.py 
Before "good": [1, 2, 3] 
After "good": [9, 2, 3] 
Before "bad" : [1, 2, 3] 
After "bad" : [1, 2, 3] 

回答

7

因爲你沒有設置FOO,你得到的東西富(富[0]準確地說)。您可以創建一個新變量foo。在good中,您可以執行類似foo.set(0, 9)(將項目0設置爲值9)。這是使用一個變量,而不是定義一個新的名稱。

+0

我想你是對的。沒有設置,沒有新的名字。 – aXqd 2010-05-07 03:20:45

+0

我想是這樣,但爲什麼不同的設置和使用之間的邏輯?如果一切順利,你還必須申報全球foo,是不是更加一致,並防止用戶拍攝自己的腳? – liang 2013-09-19 11:50:05

0

變量會先查看其內部範圍,然後再查看python中的外部範圍。例如:

FOO = 'global' 

def printfoo(): 
    print FOO 
# prints 'global' 

def printfoolocal(): 
    FOO = 'local' 
    print FOO 
# prints 'local' 

如果你想修改全局範圍的變量,你需要使用global關鍵字

def modifyfoo(): 
    global FOO 
    FOO = 'modified' 
print FOO 
# prints 'modified' 
+0

我知道這種行爲,只是對兩種情況下的差異感到好奇。我認爲@extraneon回答了我的問題。不管怎麼說,還是要謝謝你。 – aXqd 2010-05-07 03:19:59

0

爲了簡單,蟒蛇先在局部變量和在後全球的。 (用於讀取或創建變量)

因此,您可以使用foo變量:沒有本地foo變量和全局foo變量=>您採用全局變量並修改它。

糟糕的是,您創建了一個新的(本地)變量,所以全局變量不會被修改。

您可以指定一個變量是全球與全球關鍵字:

def good2(): 
    global foo 
    foo = [9, 2, 3] 
+0

>「所以,好的,你需要使用foo變量:沒有本地foo變量和全局foo變量=>取出全局變量,然後修改它。」 我的問題正是爲什麼這種行爲不會發生在'壞'。這裏有什麼規則? – aXqd 2010-05-07 03:03:31

0

如果想好,你要替換的列表foo的內容,那麼你可以分配到整個一片列表,如:

def good2(): 
    foo[:] = [9, 2, 3] 

就像在那裏分配到列表中的一個元素good,這取代了全部內容。

bad中,您綁定了一個名爲foo的列表。

+0

是的,'good2'應該和'good'一樣 – aXqd 2010-05-07 02:57:47