2015-05-29 67 views
-4

我對Python的變量範圍系統如何工作有點困惑。說我有這樣的情況:Python變量範圍的意外行爲

a = 10 
def test(): 
    print(a) 

然後,一切正常,如我所料。 Python首先查找本地變量a,但未能找到它,然後搜索全局變量。

然而,在這樣的情況下:

a = 10 
def test(): 
    print(a) 
    a += 1 
    print(a) 

的Python拋出UnboundLocalError例外,從第3行(print(a))顯然始發。對我來說,似乎至少在這一行沒有任何改變,我不明白爲什麼有一個例外。

+1

請發佈 – therealprashant

+2

@therealprashant之前正常搜索說誰回答這一個。 – vaultah

+0

@vaultah有時候確實遇到了一些需要被回答的固執的人:) – therealprashant

回答

0

這是因爲,當你對一個(它預計是全局的)做一些操作時,python會像本地一樣對待它。

所以,當你做一個+ = 1它搜索局部變量,它不會找到任何,因此錯誤。

如果您嘗試增加全局a,那麼您需要在此之前提及一個全局關鍵字。否則使用一些其他的變量,並增加它

你也可以看看:UnboundLocalError: local variable 'L' referenced before assignment Python

考慮這個

c = 0 

def increment(): 
    print c 
    c += 1 

increment() 

,如果有一個分配給一個函數內部的變量,該變量被認爲是局部因此,行

c += 1 

隱式使計數器本地增加()。 所以打印C的溫度將搜索本地變量C而不是全局變量c 我希望這很好,現在

+1

但是,這仍然不能解釋爲什麼異常來自第3行 – Parzival

+0

@Parzival如果你仔細看,那麼你會的原因 – therealprashant

0

因爲Python沒有變量聲明,函數的範圍內的每個變量賦值被認爲是本地的。所以,你總是要指定變量是全球性的:

a = 10 
def test(): 
    global a 
    print(a) 
    a += 1 
    print(a) 
test() 
+0

推薦使用'global'是一個壞主意。 – Matthias