命名空間和作用域
在這里我們首先回憶一下python代碼運行的時候遇到函式是怎么做的,
從python解釋器開始執行之后,就在記憶體中開辟了一個空間
每當遇到一個變數的時候,就把變數名和值之間的對應關系記錄下來,
但是當遇到函式定義的時候解釋器只是象征性的將函式名讀入記憶體,表示知道這個函式的存在了,至于函式內部的變數和邏輯解釋器根本不關心,
等執行到函式呼叫的時候,python解釋器會再開辟一塊記憶體來存盤這個函式里的內容,這個時候,才關注函式里面有哪些變數,而函式中的變數會存盤在新開辟出來的記憶體中,函式中的變數只能在函式的內部使用,并且會隨著函式執行完畢,這塊記憶體中的所有內容也會被清空,
我們給這個“存放名字與值的關系”的空間起了一個名字——叫做命名空間
代碼在運行伊始,創建的存盤“變數名與值的關系”的空間叫做全域命名空間,在函式的運行中開辟的臨時的空間叫做區域命名空間
命名空間的本質:存放名字與值的系結關系
python之禪
在python之禪中提到過:命名空間是一種絕妙的理念,讓我們盡情的使用發揮吧!
命名空間一共分為三種:
全域命名空間
區域命名空間
內置命名空間
*內置命名空間中存放了python解釋器為我們提供的名字:input,print,str,list,tuple...它們都是我們熟悉的,拿過來就可以用的方法,
三種命名空間之間的加載與取值順序:
加載順序:內置命名空間(程式運行前加載)->全域命名空間(程式運行中:從上到下加載)->區域命名空間(程式運行中:呼叫時才加載)
取值:
在區域呼叫:區域命名空間->全域命名空間->內置命名空間
命名空間 有三種
#內置命名空間 —— python解釋器
# 就是python解釋器一啟動就可以使用的名字存盤在內置命名空間中
# 內置的名字在啟動解釋器的時候被加載進記憶體里
#全域命名空間 —— 我們寫的代碼但不是函式中的代碼
# 是在程式從上到下被執行的程序中依次加載進記憶體的
# 放置了我們設定的所有變數名和函式名
#區域命名空間 —— 函式
# 就是函式內部定義的名字
# 當呼叫函式的時候 才會產生這個名稱空間 隨著函式執行的結束 這個命名空間就又消失了
#在區域:可以使用全域、內置命名空間中的名字
#在全域:可以使用內置命名空間中的名字,但是不能用區域中使用
#在內置:不能使用區域和全域的名字的
在區域使用變數取值情況
在全域呼叫:全域命名空間->內置命名空間
在全域參考變數x
在全域參考內置max
作用域
作用域就是作用范圍,按照生效范圍可以分為全域作用域和區域作用域,
全域作用域:包含內置名稱空間、全域名稱空間,在整個檔案的任意位置都能被參考、全域有效
區域作用域:區域名稱空間,只能在區域范圍內生效
# 作用域兩種
# 全域作用域 —— 作用在全域 —— 內置和全域名字空間中的名字都屬于全域作用域 ——globals()
# 區域作用域 —— 作用在區域 —— 函式(區域名字空間中的名字屬于區域作用域) ——locals()
# 對于不可變資料型別 在區域可是查看全域作用域中的變數,但是不能直接修改,如果想要修改,需要在程式的一開始添加global宣告
# 如果在一個區域(函式)內宣告了一個global變數,那么這個變數在區域的所有操作將對全域的變數有效
globals和locals方法
在全域呼叫globals和locals
在區域呼叫globals和locals
global關鍵字
global關鍵字
函式的嵌套和作用域鏈
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/186243.html
標籤:其他
上一篇:logging模塊的使用
