命名空間與作用域

2021-10-06 20:45:25 字數 2075 閱讀 4828

【定義】

它是儲存作用域中變數的字典。乙個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響。

【分類】

按照變數定義的位置,可以劃分為以下3類:

local,區域性命名空間,記錄了函式中定義的所有變數,包括函式的入參、內部定義的區域性變數。使用locals()檢視區域性命名空間。返回的是字典

global,全域性命名空間,記錄了每個被載入模組中定義的變數,包括模組中定義的函式、類、其他匯入的模組、模組級的變數與常量。使用globals()檢視全域性命名空間。返回的是字典

built-in,python的內建命名空間,任何模組均可以訪問,放著內建的函式和異常。使用dir(__builtins__)檢視,返回的是列表

【生命週期】

local(區域性命名空間)在函式被呼叫時才被建立,但函式返回結果或丟擲異常時被刪除。(每乙個遞迴函式都擁有自己的命名空間)。

global(全域性命名空間)在模組被載入時建立,通常一直保留直到python直譯器退出。

built-in(內建命名空間)在python直譯器啟動時建立,一直保留直到直譯器退出。

各命名空間建立順序:python直譯器啟動 ->建立內建命名空間 -> import載入模組 -> 建立全域性命名空間 ->函式被呼叫 ->建立區域性命名空間

各命名空間銷毀順序:函式呼叫結束 -> 銷毀函式對應的區域性命名空間 -> python虛擬機器(直譯器)退出 ->銷毀全域性命名空間 ->銷毀內建命名空間

python程式執行期間會有2個或3個活動的命名空間(函式呼叫時有3個,函式呼叫結束後2個)。

python直譯器載入階段會建立出內建命名空間、模組的全域性命名空間,區域性命名空間是在執行階段函式被呼叫時動態建立出來的,函式呼叫結束動態的銷毀的。

【定義】

作用域是針對變數而言,指變數在程式裡的可應用範圍。

【分類】

只有函式、類、模組會產生作用域,**塊不會產生作用域。作用域按照變數的定義位置可以劃分為4類:

local(函式內部)區域性作用域

enclosing(巢狀函式的外層函式內部)巢狀作用域(閉包)

global(模組全域性)全域性作用域

built-in(內建)內建作用域

命名空間定義了在某個作用域內變數名與值之間的對應關係,命名空間在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直譯器的啟動 關閉而產生 因而是第乙個被載入的命名空間,用來存放一些內建的...

命名空間與作用域

有了命名空間之後,就可以在棧區中存放相同的名字,詳細的命名空間 存放的名字 內建命名空間存放的是python直譯器自帶的名字 例如 print input 生命週期 py直譯器啟動則產生,直譯器關閉則銷毀 存放的名字 只要不是內建的和函式內定義的名字,都是全域性命名空間 生命週期 python檔案執...

命名空間與作用域

命名空間即存放名字與物件對映 繫結關係的地方。對於x 3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係。在程式執行期間最多會存在三種命名空間 1.內建命名空間 伴隨python直譯器的啟動 關閉而產生 因而是第乙個被載入的命名空間,...