我認爲有在 功能的前兩行也不例外,因爲「測試」和「測試」被引用。
正確。它們引用類屬性var
,而不是您定義的全局屬性。
成員「VAR」分配,但由於被引用,以獲得會員「測試」和「測試」是全球性的。
,或者換一種說法,Test
和test
在全局命名空間,這樣Test.var
和test.var
工作可用。
如果var
的值在sum()
中未更改,您將得到0,因爲它上面的行已更改Test
類屬性而非全局值。在添加一些和print
S和去除var += 1
def sum():
Test.var += 1
print Test.var
test.var += 1
print test.var
print var
sum()
...給:
1
2
0
但當下我嘗試SUM函數內的值賦給VAR,我甚至得到一個錯誤
>>> def sum():
... Test.var += 1
... print Test.var
... test.var += 1
... print test.var
... print var
... var += 1
... print var
...
>>> sum()
1
2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in sum
UnboundLocalError: local variable 'var' referenced before assignment
因爲var
現在正在總和()指定一個值,它被認爲是本地,但尚未在此之前,升定義:該行之前國家統計局。 (這意味着Python是做一些「向前看」或總和檢查variable scope
(),因爲它提高了第一print var
錯誤var
之前重新assinged。把var = 50
代替var += 1
引發同樣的錯誤。)
要使用全局變量工作:
def sum():
Test.var += 1
print Test.var
test.var += 1
print test.var
global var #added the global keyword
print var
var += 1
print var
輸出:
1
2
0 # notice that global var is still 0 because the above var+=1 are for Test.var
1
編輯:關於我提到的'向前看'行爲。打算髮佈一個關於它的問題,但它在這個答案已經很好地解釋:https://stackoverflow.com/a/370380/1431750(以Python variable scope error)
「爲了避免模棱兩可,」在精神上是正確的,但最後一段不是關於如何'VAR + = 1相當準確'出錯了。 Python永遠不能將'var + = 1'解釋爲從全局變量讀取,然後寫入本地。它可以讀取和寫入全局變量,如果'全局變量'在播放,否則它將讀取和寫入本地'var'。如果在那一點上沒有*已經有一個本地'var',那麼你會得到一個關於試圖從一個不存在的變量中讀取的異常。 – Ben