命名空间和作用域
一,namespace
-
namespace是名字到對象的映射,python里面的大部分命名空間由字典實現。如果有性能問題,會更改。
-
命名空間的舉例
?存放內置函數的集合(abs()這種函數,和內建的異常)
?模塊中的全局名稱
?函數調用中的局部名稱
?某種意義,對象的屬性集合
不同命名空間的名稱沒得關系,比如兩個模塊里面都有show()函數,只要指明是哪個模塊就行。
-
三種命名空間的區別
? 內置名稱(built-in names), Python 語言內置的名稱,比如函數名 abs、char 和異常名稱 BaseException、Exception 等等。? 全局名稱(global names),模塊中定義的名稱,記錄了模塊的變量,包括函數、類、其它導入的模塊、模塊級的變量和常量。
? 非局部和非全局之間得名稱 nonlocal
? 局部名稱(local names),函數中定義的名稱,記錄了函數的變量,包括函數的參數和局部定義的變量。(類中定義的也是)
命名空間查找順序:(從小到大)
假設我們要使用變量 BITQIAN,則 Python 的查找順序為:局部的命名空間去 -> 全局命名空間 -> 內置命名空間。
如果找不到變量 BITQIAN,它將放棄查找并引發一個 NameError 異常:
-
命名空間的生命周期
1,不同時刻創建的命名空間有不同的生命周期,包含內置名稱的命名空間(builtins)是在python解釋器啟動時創建的,不會被刪除。
2,模塊的全局命名空間在模塊定義被讀入時創建,一般,解釋器退出,消失。
3,被解釋器的頂層調用執行的語句,從一個腳本文件讀取或交互式地讀取,被認為是 main 模塊調用的一部分,因此它們擁有自己
的全局命名空間。
4,命名空間的生命周期取決于對象的作用域,如果對象執行完成,則該命名空間的生命周期就結束。因此,無法從外部命名空間訪問內 部命名空間的對象。 -
函數的命名空間
在調用時創建,函數返回值后,或者異常后刪除。但遞歸調用會有自己的命名空間。
在調用時創建,函數返回值后,或者異常后刪除。但遞歸調用會有自己的命名空間。
二,作用域
1, 作用域被靜態確定,但被動態使用。 在程序運行的任何時間,至少有三個命名空間可被直接訪問的嵌套作用域:
? 最先搜索的最內部作用域包含局部名稱。 比如一個函數/方法內部。 - local? 從最近的封閉作用域開始搜索的任何封閉函數的作用域包含非局部名稱,也包括非全局名稱。 - 嵌套函數 nonlocal、一個函數(或類) A 里面又包含了一個函數 B ,那么對于 B 中的名稱來說 A 中的作用域就為 nonlocal。? 倒數第二個作用域包含當前模塊的全局名稱 - global比如當前模塊的全局變量。? 最外面的作用域(最后搜索)是包含內置名稱的命名空間 - 一定存在 built-in
2,四種作用域的舉例
- 全局名稱與局部名稱
- 訪問全局,局部名稱,是兩個分開的東西
- 內置作用域
- 控制語句的作用域可以理解是全局的
- nonlocal,非全局也非局部,只可在嵌套函數內訪問
3,global和nonlocal的區別
- nonlocal的作用域只在嵌套函數中,而且在第一個嵌套函數中聲明了名稱,才可在第二個函數中聲明這個變量為nonlocal
- global 的名稱在函數中可以讀,但是不可寫,除非你把這個函數中的名稱也申明為global
最后,一張namespace和scope的圖送上
總結
- 上一篇: acl在内核里的位置_Linux 进程在
- 下一篇: VBA实战(6) - 数组