寫在前面
如非特別說明,下文均基于Python3
命名空間與作用于跟名字的綁定相關性很大,可以結合另一篇介紹Python名字、對象及其綁定的文章。
1. 命名空間
1.1 什么是命名空間
Namespace命名空間,也稱名字空間,是從名字到對象的映射。Python中,大部分的命名空間都是由字典來實現的,但是本文的不會涉及命名空間的實現。命名空間的一大作用是避免名字沖突:
def fun1(): i = 1def fun2(): i = 2
同一個模塊中的兩個函數中,兩個同名名字i之間絕沒有任何關系,因為它們分屬于不同明明空間。
1.2 命名空間的種類
常見的命名空間有:
built-in名字集合,包括像abs()這樣的函數,以及內置的異常名字等。通常,使用內置這個詞表示這個命名空間-內置命名空間
模塊全局名字集合,直接定義在模塊中的名字,如類,函數,導入的其他模塊等。通常,使用全局命名空間表示。
函數調用過程中的名字集合,函數中的參數,函數體定義的名字等,在函數調用時被“激活”,構成了一個命名空間。通常,使用局部命名空間表示。
一個對象的屬性集合,也構成了一個命名空間。但通常使用objname.attrname的間接方式訪問屬性,而不是直接訪問,故不將其列入命名空間討論。
類定義的命名空間,通常解釋器進入類定義時,即執行到class ClassName:語句,會新建一個命名空間。(見官方對類定義的說明)
1.3 命名空間的生命周期
不同類型的命名空間有不同的生命周期:
內置命名空間,在Python解釋器啟動時創建,解釋器退出時銷毀;
全局命名空間,模塊的全局命名空間在模塊定義被解釋器讀入時創建,解釋器退出時銷毀;
局部命名空間,這里要區分函數以及類定義。函數的局部命名空間,在函數調用時創建,函數返回或者由未捕獲的異常時銷毀;類定義的命名空間,在解釋器讀到類定義創建,類定義結束后銷毀。(關于類定義的命名空間,在類定義結束后銷毀,但其實類對象就是這個命名空間內容的包裝,見官方對類定義的說明)
2. 作用域
2.1 什么是作用域
作用域是Python的一塊文本區域,這個區域中,命名空間可以被“直接訪問”。這里的直接訪問指的是試圖在命名空間中找到名字的絕對引用(非限定引用)。這里有必要解釋下直接引用和間接引用:
直接引用;直接使用名字訪問的方式,如name,這種方式嘗試在名字空間中搜索名字name。
間接引用;使用形如objname.attrname的方式,即屬性引用,這種方式不會在命名空間中搜索名字attrname,而是搜索名字objname,再訪問其屬性。
2.2 與命名空間的關系
新聞熱點
疑難解答