2014-02-14 58 views
2

我不禁納悶......未定義的變量及作用域規則

配置:

[email protected]:~/$ python --version 
Python 2.7.5+ 

代碼:

import logging 
logger = logging.getLogger('x') 

def main(): 
    print logger 
    logger = 2 

if __name__ == "__main__": 
    main() 

輸出:

[email protected]:~/$ python ./manager.py 
Traceback (most recent call last): 
    File "./manager.py", line 9, in <module> 
    main() 
File "./manager.py", line 5, in main 
    print logger 
UnboundLocalError: local variable 'logger' referenced before assignment 

顯然,我期望print語句訪問glob盟友定義的記錄器變量。有沒有我不明白的python變量範圍規則?

另外,顯然,logger = 2語句不應該做太多。但是,如果我刪除它,未定義的變量異常消失。

+0

您正在分配給名稱=>本地。 –

+1

「有什麼我不瞭解python變量範圍規則嗎?」是。你不明白,你可以有局部變量與全局範圍聲明的變量名稱相同。如果你想在全局範圍使用變量,你需要這樣說:'def main():global logging;打印記錄器;記錄器= 2' – hughdbrown

+0

這應該是'全球記錄器'。抱歉。 – hughdbrown

回答

1

只要您不重新定義一個名稱(即將其分配給另一個值),就可以使用它,而無需使用global語句從全局範圍隱式獲取它。

一旦你想重新定義它或修改它,你需要明確你正在談論哪個名字。

>>> a = 'hello' 
>>> def f(): 
... print(a) 
... 
>>> def f2(): 
... global a 
... a = 'world' 
... print(a) 
... 
>>> f() 
hello 
>>> f2() 
world 
>>> a 
'world'