【定義】
名稱到物件的對映。命名空間是乙個字典的實現,鍵為變數名,值是變數對應的值。各個命名空間是獨立沒有關係的,乙個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響。
【分類】
python程式執行期間會有2個或3個活動的命名空間(函式呼叫時有3個,函式呼叫結束後2個)。按照變數定義的位置,可以劃分為以下3類:
local,區域性命名空間,每個函式所擁有的命名空間,記錄了函式中定義的所有變數,包括函式的入參、內部定義的區域性變數。
global,全域性命名空間,每個模組載入執行時建立的,記錄了模組中定義的變數,包括模組中定義的函式、類、其他匯入的模組、模組級的變數與常量。
built-in,python自帶的內建命名空間,任何模組均可以訪問,放著內建的函式和異常。
【生命週期】
local(區域性命名空間)在函式被呼叫時才被建立,但函式返回結果或丟擲異常時被刪除。(每乙個遞迴函式都擁有自己的命名空間)。
global(全域性命名空間)在模組被載入時建立,通常一直保留直到python直譯器退出。
built-in(內建命名空間)在python直譯器啟動時建立,一直保留直到直譯器退出。
各命名空間建立順序:python直譯器啟動 ->建立內建命名空間 -> 載入模組 -> 建立全域性命名空間 ->函式被呼叫 ->建立區域性命名空間
各命名空間銷毀順序:函式呼叫結束 -> 銷毀函式對應的區域性命名空間 -> python虛擬機器(直譯器)退出 ->銷毀全域性命名空間 ->銷毀內建命名空間
python直譯器載入階段會建立出內建命名空間、模組的全域性命名空間,區域性命名空間是在執行階段函式被呼叫時動態建立出來的,函式呼叫結束動態的銷毀的。
【定義】
作用域是針對變數而言,指申明的變數在程式裡的可應用範圍。或者稱為變數的可見性。
【分類】
local(函式內部)區域性作用域
enclosing(巢狀函式的外層函式內部)巢狀作用域(閉包)
global(模組全域性)全域性作用域
built-in(內建)內建作用域
【規則】
1、靜態作用域規則
定義:python中變數的作用域是由它在源**中的位置決定的。(名字查詢是動態發生的)
說明:參考**3/4,以**3為例說明,在模組中定義了乙個全域性變數 i = 1,在test方法中執行 i += 1,對變數 i進行了賦值動作,該賦值動作決定了i在test()方法中是乙個區域性變數, i += 1可以拆分為兩步執行,首先執行 i + 1, 然後將結果賦值給i。執行i + 1操作時,i雖然申明為區域性變數,但是沒有繫結任何具體值,因此報錯。
2、最內巢狀作用域規則
定義:由乙個賦值語句引進的名字在這個賦值語句所在的作用域裡是可見(起作用)的,而且在其內部巢狀的每個作用域內也可見,除非它被巢狀於內部的且引進同樣名字的賦值語句所遮蔽。
說明:參考**5. 方法g()是方法f()中定義的內嵌函式。在方法f()中定義的區域性變數 i =2,在內嵌方法 g()中是可見的。如果在g()中又定義乙個重名的變數 i = 3,則f()中定義的變數將被遮蔽。
命名空間定義了在某個作用域內變數名和繫結值之間的對應關係,命名空間是鍵值對的集合,變數名與值是一一對應關係。作用域定義了命名空間中的變數能夠在多大範圍內起作用。
命名空間在python直譯器中是以字典的形式存在的,是以一種可以看得見摸得著的實體存在的。作用域是python直譯器定義的一種規則,該規則確定了執行時變數查詢的順序,是一種形而上的虛的規定。
【變數查詢法則】
python直譯器動態執行過程中,對遇到的變數進行解釋時,是按照一條固定的作用域鏈查詢解釋的,又稱為legb法則。
其中l代表local 區域性作用域,e代表enclosing 巢狀作用域,g代表global 全域性作用域,b代表built-in 內建作用域。
python直譯器查詢變數時,會按照順序依次查詢區域性作用域,巢狀作用域,全域性作用域,內建作用域,在任意乙個作用域中找到變數則停止查詢,所有作用域查詢完成沒有找到對應的變數,則丟擲 nameerror: name '***x' is not defined的異常。
在區域性作用域中,可以看到區域性作用域、巢狀作用域、全域性作用域、內建作用域中所有定義的變數。
在全域性作用域中,可以看到全域性作用域、內建作用域中的所有定義的變數,無法看到區域性作用域中的變數。
命名空間與作用域
命名空間即存放名字與物件對映 繫結關係的地方。對於x 3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係。在程式執行期間最多會存在三種命名空間 伴隨python直譯器的啟動 關閉而產生 因而是第乙個被載入的命名空間,用來存放一些內建的...
命名空間與作用域
定義 它是儲存作用域中變數的字典。乙個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響。分類 按照變數定義的位置,可以劃分為以下3類 local,區域性命名空間,記錄了函式中定義的所有變數,包括函式的入參 內部定義的區域性變數。使用locals 檢視區域性命名空間。返回的是字典 glo...
命名空間與作用域
有了命名空間之後,就可以在棧區中存放相同的名字,詳細的命名空間 存放的名字 內建命名空間存放的是python直譯器自帶的名字 例如 print input 生命週期 py直譯器啟動則產生,直譯器關閉則銷毀 存放的名字 只要不是內建的和函式內定義的名字,都是全域性命名空間 生命週期 python檔案執...