區域性命名空間下
def
foo():
a = a
if __name__ ==
'__main__'
: foo(
)
報錯資訊:unboundlocalerror: local variable 『a』 referenced before assignment
全域性命名空間下
if __name__ ==
'__main__'
: b = b
報錯資訊:nameerror: name 『b』 is not defined
為什麼在不同的作用域下報錯資訊不一樣呢?
要解決這個問題,就必須了解namespace,也就是命名空間。命名空間是變數名和物件本身的對映,就像是人名與人本身的對映一樣。共有四種型別的命名空間:
命名空間是何時建立的呢?
變數名是何時加入到命名空間的呢?
def foo()
: # 建立了命名空間,但內容為空
print
(locals()
)if true:
# 將a加入到命名空間
a =1else
: # 因為沒有執行,所以沒有將b加入到命名空間
b =2print
(locals()
)if __name__ ==
'__main__'
:foo()
# 執行結果
# #
從上面這個例子,可以知道,只有賦值語句被執行時,才會將相應的變數名加入到命名空間中。
那麼對於a=a
,命名空間是如何處理的呢?
查了很多資料,也沒有找到答案。但根據已知的內容,我猜測區域性命名空間和全域性命名空間對a=a
的處理方式並不同。
二者的區別就在於a加入到命名空間是在賦值操作前還是在賦值操作後。參考
命名空間的生命週期
由乙個例子到python的名字空間
python命名空間與作用域
Python 命名空間
本文介紹python中命名空間中的legb原則。legb含 釋 l local function 函式內的名字空間,包括區域性變數和形參 e enclosing function locals 外部巢狀函式的名字空間 例如closure g global module 函式定義所在模組 檔案 的名字...
python 命名空間
作用域 第五章說過,將輸入字元作為命令放在作用域字典裡 作用域,每個函式都有乙個作用域,就是 字典,字典名字為函式名,鍵為變數,鍵值為變數對應的賦值。函式的作用域為區域性作用域 在函式內部訪問全域性變數,且只是讀取變數的值不重新繫結變數。這樣引用易出錯誤。慎重使用全域性變數 defcombine p...
python命名空間
變數是擁有匹配物件的名字 識別符號 命名空間是乙個包含了變數名稱們 鍵 和它們各自相應的物件們 值 的字典。乙個 python 表示式可以訪問區域性命名空間和全域性命名空間裡的變數。如果乙個區域性變數和乙個全域性變數重名,則區域性變數會覆蓋全域性變數。每個函式都有自己的命名空間。類的方法的作用域規則...