1. 程式人生 > >08 名稱空間與作用域

08 名稱空間與作用域

一、名稱空間namespace:存放 名字與值記憶體地址繫結關係 的地方

1.內建名稱空間(Built-in):存放python自帶的名稱與值的繫結體,len、  print、 sum等內建方法的名字,注意關鍵字比如if、while...不存放在其中  

產生:在python直譯器啟動時建立

銷燬:python直譯器退出時關閉

2.全域性名稱空間(Global):當開啟一個檔案然後執行時,全域性名稱空間記錄了檔案中定義的變數,包括此檔案中定義的函式、類、其他匯入的模組、模組級的變數與常量。

產生:在.py檔案被載入時建立,通常一直保留直到檔案執行結束

銷燬:python直譯器執行python程式完畢後退出銷燬

3.區域性名稱空間(Local):每個函式所擁有的名稱空間,記錄了函式中定義的所有變數,包括函式的引數、內部定義的區域性變數。

產生:在函式被呼叫時才被建立

銷燬:但函式返回結果或丟擲異常時被刪除。(每一個遞迴函式都擁有自己的名稱空間)。

如果函式多層巢狀,介於全域性和區域性間,還有當前所在層函式的名稱空間,比如函式巢狀定義時,putin()函式有自己的名稱空間,也可以看作區域性名稱空間,只不過

它的子函式close_door()還有自己的區域性名稱空間(Local),即,區域性是相對的。

 

名稱空間的載入順序:內建======》全域性======》區域性

名稱空間的訪問順序:區域性===逐層往上===》全域性====》內建

 

二、作用域:名稱空間的作用範圍

Global廣義化為—— 全域性+內建名稱空間

Local——  區域性名稱空間。可以用 print(global())   和在區域性用print(local()) 檢視當前位置的作用域內都有哪些"名稱”。

還可以用 global  變數名 的方式,將變數宣告為全域性變數。nonlocal 變數名,將會宣告:之後在當前作用域使用這個變數,將會引用外層(優先上一層)變數,但引用不到全域性。

函式的作用域在定義時就固定了,與之後呼叫函式的位置無關!!!!