一、什麼是名稱空間
名稱空間(namespace)指的是變數儲存的位置,是對棧區的劃分。每一個變數都需要儲存到指定的名稱空間中。每一個作用域都會有一個它對應的名稱空間。名稱空間主要分為 內建名稱空間、全域性名稱空間 和 區域性名稱空間 三種。名稱空間實際上就是一個字典,是一個專門用於儲存變數的字典。
- 內建名稱空間 用來儲存 Python 直譯器內建的名字。內建名稱空間 在 Python 直譯器啟動時產生,在 Python 直譯器關閉時銷燬。
- 全域性名稱空間 用來儲存 全域性變數(不是函式內定義的名字)。全域性名稱空間 在 Python 檔案執行時產生,在 Python 檔案執行完畢後銷燬。
- 函式名稱空間 用來儲存 函式中的變數(在呼叫函式時,執行函式體程式碼過程中產生的函式內的名字)。區域性名稱空間 在呼叫函式時存活,函式呼叫完畢後銷燬。
def func():
print(x)
x = 10
func()
名稱空間的載入順序:內建名稱空間 > 全域性名稱空間 > 區域性名稱空間;
名稱空間的銷燬順序:區域性名稱空間 > 全域性名稱空間 > 內建名稱空間;
名字的查詢優先順序:當前所在的位置向上一層一層查詢;
二、獲取名稱空間
我們可以使用 locals() 函式來獲取當前作用域的名稱空間。
如果在全域性作用域中呼叫 locals() 函式,則獲取全域性名稱空間;如果在函式作用域中呼叫 locals() 函式,則獲取函式的名稱空間。locals() 函式返回的是一個字典。我們可以向字典中新增一個 key-value,這相當於在全域性中建立了一個變數,但是不建議這樣做。
a = 10
scope = locals()
print(scope,'\n')
print(type(scope), '\n')
# 向字典中新增key-value就相當於在全域性中建立了一個變數
scope['b'] = 10
print('b = ',b)
在函式內部呼叫 locals() 會獲取函式的名稱空間。
def func():
a = 10
scope = locals()
print(scope,'\n')
print(type(scope),'\n')
func()
我們可以使用 globals() 函式在任意位置獲取全域性名稱空間。
a = 10
def func():
b = 10
global_scope = globals()
print(global_scope, '\n')
print(type(global_scope), '\n')
print(global_scope['a'])
global_scope['a'] = 30
func()
print(a)