命名空間
幾乎所有的語言都有類似的機制,在Python中命名空間分三種,區域、全域和內建,或(四種,嵌套的區域作用域在Python中叫閉包 Enclosing)
定義
名稱到物件的映射,命名空間是一個字典的實作,鍵為變數名,值是變數對應的值,各個命名空間是獨立沒有關系的,一個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響,
分類
python程式執行期間會有2個或3個活動的命名空間(函式呼叫時有3個,函式呼叫結束后2個),按照變數定義的位置,可以劃分為以下3類:
Local
區域命名空間,每個函式所擁有的命名空間,記錄了函式中定義的所有變數,包括函式的入參、內部定義的區域變數,
Global
全域命名空間,每個模塊加載執行時創建的,記錄了模塊中定義的變數,包括模塊中定義的函式、類、其他匯入的模塊、模塊級的變數與常量,
Built-in,python
自帶的內建命名空間,任何模塊均可以訪問,放著內置的函式和例外
生命周期
Local(區域命名空間)
在函式被呼叫時才被創建,但函式回傳結果或拋出例外時被洗掉,(每一個遞回函式都擁有自己的命名空間),
Global(全域命名空間)
在模塊被加載時創建,通常一直保留直到python解釋器退出,
Built-in(內建命名空間)
在python解釋器啟動時創建,一直保留直到解釋器退出,
創建與銷毀
1 python解釋器啟動 ->創建內建命名空間 -> 加載模塊 -> 創建全域命名空間 ->函式被呼叫 ->創建區域命名空間
2 各命名空間銷毀順序:函式呼叫結束 -> 銷毀函式對應的區域命名空間 -> python虛擬機(解釋器)退出 ->銷毀全域命名空間 ->銷毀內建命名空間
3 python解釋器加載階段會創建出內建命名空間、模塊的全域命名空間,區域命名空間是在運行階段函式被呼叫時動態創建出來的,函式呼叫結束動態的銷毀的,
作用域
定義
作用域是針對變數而言,指申明的變數在程式里的可應用范圍,或者稱為變數的可見性,
分類
只有函式、類、模塊會產生作用域,代碼塊不會產生作用域(參考代碼1),作用域按照變數的定義位置可以劃分為4類:
Local(函式內部)區域作用域
Enclosing(嵌套函式的外層函式內部)嵌套作用域(閉包)
Global(模塊全域)全域作用域
Built-in(內建)內建作用域
命名空間與作用域的關系
命名空間定義了在某個作用域內變數名和系結值之間的對應關系,命名空間是鍵值對的集合,變數名與值是一一對應關系,作用域定義了命名空間中的變數能夠在多大范圍內起作用,
命名空間在python解釋器中是以字典的形式存在的,是以一種可以看得見摸得著的物體存在的,作用域是python解釋器定義的一種規則,該規則確定了運行時變數查找的順序,是一種形而上的虛的規定,
變數查找法則
python解釋器動態執行程序中,對遇到的變數進行解釋時,是按照一條固定的作用域鏈查找解釋的,又稱為LEGB法則,
其中L代表Local 區域作用域,E代表Enclosing 嵌套作用域,G代表Global 全域作用域,B代表Built-in 內建作用域,
python解釋器查找變數時,會按照順序依次查找區域作用域,嵌套作用域,全域作用域,內建作用域,在任意一個作用域中找到變數則停止查找,所有作用域查找完成沒有找到對應的變數,則拋出 NameError: name 'xxxx' is not defined的例外,
在區域作用域中,可以看到區域作用域、嵌套作用域、全域作用域、內建作用域中所有定義的變數,
在全域作用域中,可以看到全域作用域、內建作用域中的所有定義的變數,無法看到區域作用域中的變數,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/122697.html
標籤:Python
上一篇:Python 模塊和包
下一篇:生成器和迭代器
