2013-08-01 86 views
1

有一個奇怪的行爲與範圍可見性,我無法在手冊中找到它。因此,這裏是我的代碼簡化到基地的一塊。Python中奇怪的可見性範圍行爲

from server import WWW_DOCUMENT_ROOT 

def write_config(project_abs_path): 
    print WWW_DOCUMENT_ROOT 

    # WWW_DOCUMENT_ROOT = 'A' 

在這裏,如果最後一行 - 分配 - 已被註釋掉,print WWW_DOCUMENT_ROOT工作正常,並打印全球的價值。 如果賦值語句取消註釋 - print WWW_DOCUMENT_ROOT停止工作並且說'WWW_DOCUMENT_ROOT' referenced before assignment

顯然問題是用global WWW_DOCUMENT_ROOT語句修復的,但是爲什麼它的行爲不同取決於變量是否在代碼中稍後分配。這是不穩定和不明顯的,或者我在這裏沒有得到什麼。這是爲什麼呢?

python 2.7.3

+0

[簡要說明Python的作用域規則的(可能重複http://stackoverflow.com/questions/291978/短描述-的-蟒-作用域規則) –

回答

0

,直到分配給它你指的是一個功能的名字被認爲是一個全球性的,

編譯器在函數中看到賦值,並將該名稱標記爲本地變量。作爲本地名稱,當您嘗試打印時,WWW_DOCUMENT_ROOT沒有任何價值。

使用global關鍵字,如果你想分配給WWW_DOCUMENT_ROOT影響全局變量:

def write_config(project_abs_path): 
    global WWW_DOCUMENT_ROOT 
    print WWW_DOCUMENT_ROOT 

    WWW_DOCUMENT_ROOT = 'A'