1定義
命名空間是從名稱到對象的映射驹溃,大部分的命名空間都是通過Python字典來實現(xiàn)的城丧,鍵值key是變量名,值value是變量值豌鹤。
命名空間提供了在項目中避免名字沖突的一種方法亡哄,各個命名空間是獨立的。所以同一個命名空間是不能有重名的布疙,但是不同的命名空間可以重名磺平。
2分類
python程序在執(zhí)行期間會有2-3個活動的命名空間,函數(shù)調(diào)用時有3個拐辽,非函數(shù)調(diào)用階段有2個。
- 內(nèi)置名稱(built-in names):Python 語言內(nèi)置的名稱擦酌,任何模塊都可以訪問俱诸,比如函數(shù)名 abs、char 和異常名稱 BaseException赊舶、Exception 等等睁搭。
- 全局名稱(global names):模塊中定義的名稱,記錄了模塊的變量笼平,包括函數(shù)园骆、類、其它導(dǎo)入的模塊寓调、模塊級的變量和常量锌唾。
-
局部名稱(local names):函數(shù)中定義的名稱,記錄了函數(shù)的變量夺英,包括函數(shù)的參數(shù)和局部定義的變量晌涕。(類中定義的也是)
3查找順序
假設(shè)我們要使用變量isNeeded,Python查找的順序為局部的命名空間 -> 全局命名空間 -> 內(nèi)置命名空間。(調(diào)用函數(shù)的時候局部命名空間才活躍痛悯,若是沒有調(diào)用函數(shù)余黎,則直接在全局命名空間查找,若無果再在內(nèi)置命名空間查找)
若查找完三個命名空間后找不到變量isNeeded载萌,將引發(fā)NameError異常:NameError: name 'runoob' is not defined惧财。
4生命周期
命名空間的生命周期取決于對象的作用域巡扇。
Global(全局命名空間)在模塊被加載時創(chuàng)建,通常一直保留直到python解釋器退出垮衷。
Built-in(內(nèi)建命名空間)在python解釋器啟動時創(chuàng)建厅翔,一直保留直到解釋器退出。
Local(局部命名空間)在函數(shù)被調(diào)用時被創(chuàng)建帘靡,函數(shù)返回結(jié)果或者拋出異常時被刪除知给。(注:每一個遞歸函數(shù)都有自己的命名空間)
4.1創(chuàng)建順序
各命名空間創(chuàng)建順序:python解釋器啟動 ->創(chuàng)建內(nèi)建命名空間 -> 加載模塊 -> 創(chuàng)建全局命名空間 ->函數(shù)被調(diào)用 ->創(chuàng)建局部命名空間
4.2銷毀順序
各命名空間銷毀順序:函數(shù)調(diào)用結(jié)束 -> 銷毀函數(shù)對應(yīng)的局部命名空間 -> python虛擬機(jī)(解釋器)退出 ->銷毀全局命名空間 ->銷毀內(nèi)建命名空間
python解釋器加載階段會創(chuàng)建出內(nèi)建命名空間、模塊的全局命名空間描姚,局部命名空間是在運行階段函數(shù)被調(diào)用時動態(tài)創(chuàng)建出來的涩赢,函數(shù)調(diào)用結(jié)束動態(tài)的銷毀的。
5屬性
python的全局命名空間存儲在一個叫globals()的dict對象中轩勘;局部命名空間存儲在一個叫locals()的dict對象中筒扒。可以用print (locals())來查看該函數(shù)體內(nèi)的所有變量名和變量值绊寻。