11. 名稱空間

星光樱梦發表於2024-09-26

一、什麼是名稱空間

  名稱空間(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)

相關文章