python命名空間

2021-09-26 02:59:09 字數 1193 閱讀 7906

區域性命名空間下

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 表示式可以訪問區域性命名空間和全域性命名空間裡的變數。如果乙個區域性變數和乙個全域性變數重名,則區域性變數會覆蓋全域性變數。每個函式都有自己的命名空間。類的方法的作用域規則...