1樓:李小離
區域性命名空間裡已經有「a」這個變數了,當然不會再向上搜尋啦。只不過「a」沒有被賦值,所以產生了 UnboundLocalError。
2樓:42nd Mu00
a+=1相當於a=a+1,賦值操作右邊的先執行,然而區域性作用域內沒有出現的變數名被賦值就預設優先為初始化,自然會矛盾報錯了。
加個global宣告全域性變數就行了
3樓:
命名空間:乙個容器,其中包含的是對映到不同物件的名稱。
作用域:定義了乙個「層次」,我們從其中的命名空間中查詢特定的「名稱-物件」對映對。
全域性變數與區域性變數的字典對映,可使用函式globals()和locals()
LEGB規則,表示的是Local -> Enclosed -> Global -> Built-in
問題的關鍵就是:
如果我們沒有明確地告訴Python我們要使用的是全域性作用域,而是直接嘗試修改變數值的話,就很容易產生UnboundLocalError。(記住,賦值操作的右半部分是先執行的)
eg:a_var=1
defa_func
():a_var
=a_var+1
(a_var
,'[ a_var inside a_func() ]'
(a_var
,'[ a_var outside a_func() ]'
)a_func
()報錯
:UnboundLocalError
:local
variable
'a_var'
referenced
before
assignment
修改版:加上變數的作用域。
a_var=1
defa_func
():global
a_var
a_var
=a_var+1
(a_var
,'[ a_var inside a_func() ]'
(a_var
,'[ a_var outside a_func() ]'
)a_func
()結果:1
[a_var
outside
a_func()]
2[a_var
inside
a_func()]
[Finished
in0.2s]
LEGB - 區域性,外圍,全域性,內建
4樓:
LEGB表示順序,但需要有一定的條件。題主的f函式沒有形參,直接對a進行賦值會出錯。宣告一下global a,函式就可以了
deff
():globalaa
+=1print(a
)同樣的,在Python 3.X 中,巢狀的函式需要使用nonlocal,這樣在內函式中可以呼叫外層變數。
參考:Functions can freely use names assigned in syntactically enclosing functions and the global scope, but they must declare suchnonlocalsandglobalsin order to change them(Mark Litz, Learning Python 4th, 2013, P 508)
新手問一下,突然想到如果我用python3的寫法寫python2程式會怎麼樣?
婉婷 Python的3.0版本,常被稱為Python 3000,或簡稱Py3k。相對於Python的早期版本,這是乙個較大的公升級。為了不帶入過多的累贅,Python 3.0在設計的時候沒有考慮向下相容。許多針對早期Python版本設計的程式都無法在Python 3.0上正常執行。為了照顧現有程式,...
python3捕獲的2個異常屬於同一異常型別,要怎麼寫?
Coldwings 你自己琢磨琢磨這個邏輯 丟擲了乙個異常,TypeError,你怎麼確定到底輸出啥?什麼時候輸出前一句什麼時候輸出後一句?畢竟你只捕獲了錯誤型別,程式執行到這裡也只是知道乙個錯誤型別,完全不能判斷到底需要被哪個分支捕獲,那麼自然是遵循幾乎所有程式語言裡try block錯誤捕獲的共...
Python3如何實現兩個列表的交叉列印?
defiter cross iterables copy iter item for item initerables while copy 一直迭代到copy列表為空 foritem incopy try yield next item except StopIteration 如果next 丟擲...