關於python3命名空間的問題?

時間 2021-06-01 16:12:48

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

print

(a_var

,'[ a_var inside a_func() ]'

)print

(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

print

(a_var

,'[ a_var inside a_func() ]'

)print

(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 丟擲...