Python命名空間(Namespaces)和作用域(Scopes)講座
命名空間(Namespace)
命名空間(Namespace),是名稱到對象的映射。
命名空間提供了在項目中避免名字沖突的一種方法。命名空間是獨立的,沒有任何關系的,所以一個命名空間中不能有重名,但不同的命名空間是可以重名而沒有任何影響——
不同命名空間中的名稱之間絕對沒有關系,請牢記這一點
。
多個名稱(在多個作用域內)可以綁定到同一個對象。這在其他語言中稱為別名。在處理不可變的基本類型(數字,字符串,元組)時可以安全地忽略它。但是,對于可變對象,如列表,字典和大多數其他類型在某些方面表現得像指針,如果函數修改了作為參數傳遞的對象,調用者將看到更改。
幾個命名空間的例子:存放內置函數的集合(包含 abs() 這樣的函數名,和內建的異常名稱 BaseException、Exception 等等);模塊中的全局名稱;函數中的局部名稱,包括函數的參數和函數中的變量。 從某種意義上說,對象的屬性集合也是一種命名空間的形式。
命名空間查找順序
當一行代碼要使用變量 x 的值時,Python 會到所有可用的名字空間去查找變量,按照如下順序:
1、局部命名空間:特指當前函數或類的方法。如果函數定義了一個局部變量 x,或一個參數 x,Python 將使用它,然后停止搜索。
2、全局命名空間:特指當前的模塊。如果模塊定義了一個名為 x 的變量,函數或類,Python 將使用它然后停止搜索。
3、內置命名空間:對每個模塊都是全局的。作為最后的嘗試,Python 將假設 x 是內置函數或變量。
4、如果 Python 在這些名字空間找不到 x,它將放棄查找并引發一個 NameError 異常,如,NameError: name 'aa' is not defined。
嵌套函數的情況:
1、先在當前 (嵌套的或 lambda) 函數的命名空間中搜索
2、然后是在父函數的命名空間中搜索
3、接著是模塊命名空間中搜索
4、最后在內置命名空間中搜索
命名空間的生命周期
不同的命名空間在不同的時刻創建,有不同的生存期。
1、內置命名空間在 Python 解釋器啟動時創建,會一直保留,不被刪除。
2、模塊的全局命名空間在模塊定義被讀入時創建,通常模塊命名空間也會一直保存到解釋器退出。
3、當函數被調用時創建一個局部命名空間,當函數返回結果 或 拋出異常時,被刪除。每一個遞歸調用的函數都擁有自己的命名空間。
作用域(Scopes)
變量的作用域決定了在哪一部分程序可以訪問哪個特定的變量名稱。