2012-02-25 83 views
2
>>> import sys 
>>> print(sys.version) 
2.4.4 
>>> b = 11 
>>> def foo2(): 
... a = b 
... print a, b 
... 
>>> foo2() 
11 11 
>>> def foo3(): 
... a = b 
... b = 12 
... print a, b 
... 
>>> foo3() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in foo3 
UnboundLocalError: local variable 'b' referenced before assignment 
>>> def foo4(): 
... global b 
... a = b 
... b = 12 
... print a, b 
... 
>>> foo4() 
11 12 

問題>在foo3,爲什麼你可以訪問全局變量未聲明的,但你仍然不能修改它。爲什麼你可以閱讀但不能修改全局值?

+3

因爲它是有道理這樣。 – delnan 2012-02-25 19:14:45

回答

4

如果沒有global聲明,Python的編譯器掃描每個功能的全部代碼,以查看哪些變量分配給功能代碼內。在foo3(),分配給兩個ab等於是它們都當作函數內的局部變量。

當方法代碼執行時,在你做的點a = bb還沒有值(因爲你還沒有分配任何東西)。因此,你得到一個UnboundLocalError

這樣做是爲了使功能中的變量始終使用引用相同的位置,即使還沒有分配給它。

+0

所以你的觀點是'foo2'工作b/c'b'沒有被賦值,它被當作一個可能的全局變量。 – q0987 2012-02-25 19:24:35

+1

@ q0987:正確。 Python搜索本地和全局名稱空間來讀取變量。 – 2012-02-25 20:21:18

3

在全局變量不小心踩是錯誤的常見來源。所以是有意義的聲明一個變量global之前對其進行修改。

說完就始終聲明非本地變量global是一種痛苦。所以如果你只是讀了它,你就可以使用全局變量。但是,如果你要在你的函數的任何地方修改X,你必須做你什麼它之前宣佈其全球性的。

+1

也有必要指出,使用全局變量通常(但並非總是)函數內部是一個壞主意,部分原因是由於可讀性和清晰性,並且經常訪問/修改全局變量比僅使用局部變量要慢。 – Anorov 2012-02-25 22:10:07

相關問題