2010-09-07 53 views

回答

7

如果您讀取了一個變量,Python會在整個範圍鏈中查找它。這意味着:

GLOB_VAR = "Some string" 

def some_fun(): 
    print GLOB_VAR 

將打印Some string

現在,如果你寫一個變量,Python將它在局部範圍內,如果不能找到你給的名稱的變量地方一級,然後創建一個。

這意味着,在你的榜樣,你已經創建了一個名爲SOME_VARIABLE您的本地some_fun函數的變量,而不是更新的全球SOME_VARIABLE。這是一個經典的python陷阱。

如果你想寫入你的全局,你必須明確地告訴Python你正在談論一個已經存在的全局變量。爲此,您需要使用global關鍵字。因此,以下內容:

GLOB_VAR = "Some string" 

def some_fun(): 
    global GLOB_VAR 
    GLOB_VAR = "Some other string" 

some_fun() 
print GLOB_VAR 

將打印Some other string

注:我認爲這是一種鼓勵人們保持全局變量爲只讀的方式,或者至少考慮他們在做什麼

當您嘗試先讀取然後寫入全局行爲時,行爲是相同的(只是更令人驚訝)。以下:

GLOB_VAR = False 

def some_fun(): 
    if GLOB_VAR: 
     GLOB_VAR = False 

some_fun() 

將提高:

Traceback (most recent call last): 
    File "t.py", line 7, in <module> 
    some_fun() 
    File "t.py", line 4, in some_fun 
    if GLOB_VAR: 
UnboundLocalError: local variable 'GLOB_VAR' referenced before assignment 

因爲自從我們將修改GLOB_VAR,它被認爲是一個局部變量。

更新Ely Bendersky有一個相關的in-depth post關於這是值得閱讀更正式的細節。

0

SOME_VARIABLE是全球性的,重新綁定它不會生效,除非您使用global。但是因爲它是一個可變對象,所以應該適當地進行變異。

del SOME_VARIABLE[:] 
5

你需要告訴你是在談論一個全局變量的解釋:

def some_fun: 
    global SOME_VARIABLE 
    ... 
    SOME_VARIABLE = [] 
2

,如果你不需要SOME_VARIABLE了,那麼你可以使用:

del SOME_VARIABLE 

如果你想要一個空的清單:

del SOME_VARIABLE[:]