Python 命名空間 (Namespace)(16):程式架構中看不見的地基

在 Python 中,幾乎所有程式的行為都圍繞著「名稱」與「對象」之間的關係展開。

當你撰寫一行簡單的 x = 5 時,其實背後涉及到的是「名稱如何被儲存」、「在哪裡能被找到」,以及「程式如何知道應該使用哪個值」。

這些問題的答案,就隱藏在 命名空間(Namespace)作用域(Scope) 的概念之中。

理解它們,能幫助你避免常見錯誤,並寫出更清晰、更具結構性的程式碼。

什麼是命名空間 (Namespace)?

命名空間是名稱及其引用對象的集合。Python 使用字典來存儲這些信息,其中鍵是已定義的名稱,值是這些名稱引用的對象。

目的

區分程式中的不同對象,避免名稱衝突

結構

以字典形式存在,鍵是名稱,值是對象

例子

{'color': 'cyan'}

當我們使用 print(color) 時,Python 會在相應的命名空間中尋找名為 color 的鍵,並提供其值用於我們的程式。

Python 的四種命名空間

Python 依層級劃分四種命名空間:

  1. 內建命名空間 (Built-in Namespace)
    • 由 Python 解譯器啟動時建立,程式結束時消失
    • 包含 print()len()intlistValueError
    • 可用 dir(__builtins__) 查看所有名稱
  2. 全域命名空間 (Global Namespace)
    • 由模組建立,包含在頂層定義的變數、函數與匯入的模組
    • 直到程式結束才會消失
    • 可用 globals() 查看
  3. 封閉命名空間 (Enclosing Namespace)
    • 嵌套函數時建立,內部函數可訪問外部函數的變數
    • 外部函數無法訪問內部函數的變數
  4. 局部命名空間 (Local Namespace)
    • 呼叫函數時建立,包含函數的參數與區域變數
    • 函數執行結束後消失
    • 可用 locals() 查看
Four nested containers labeled as Built-in, Global, Enclosing, and Local namespaces, with the smallest one in the center and progressively larger ones surrounding it

內建命名空間 (Built-in Namespace)

主要特點:

  • Python 解釋器啟動時創建
  • 在程式結束時終止
  • 包含所有內建函數和例外
  • 無需導入即可使用
  • 位於命名空間階層的最高層

內建命名空間包含許多常用的函數和對象,例如:

函數

print(), str(), len(), zip(), sorted()

例外

ArithmeticError, IndexError, KeyError

常數

True, False, None

我們可以使用 print(dir(__builtins__)) 來查看所有內建對象

內建命名空間:實際演示

執行 print(dir(__builtins__)) 會顯示 Python 提供的所有內建名稱,包括:

基本函數

print(), input(), len(), range()

數據類型

int, str, list, dict, set

例外

ValueError, TypeError, IndexError

這些名稱在任何 Python 程式中都可以直接使用,不需要額外導入。

Computer screen displaying a long list of Python built-in functions and objects from dir(__builtins__) command

全域命名空間 (Global Namespace)

全域命名空間位於內建命名空間之下,通常包括我們程式中所有非嵌套的名稱。

創建時機

當我們運行主程式時創建

存在時間

直到解釋器終止(通常是程式結束時)

包含內容

模組中定義的所有頂層變數、函數和導入的模組

使用 globals() 函數可以查看全域命名空間的內容

全域命名空間:實例分析

#main.py
import random
first_name = "Jaya"
last_name = "Bodegard"

def print_variables():
  random_number = random.randint(0,9)
  print(first_name)
  print(last_name)
  print(random_number)

print(globals())

執行 print(globals()) 會顯示全域命名空間中的內容,包括:

  • 全域變數:first_name, last_name
  • 函數:print_variables
  • 導入模組:random
  • 其他 Python 內部對象,如 __name__, __file__

注意:random_number 不在全域命名空間中,因為它是在函數內部定義的。

局部命名空間 (Local Namespace)

主要特點

  • 當函數執行時創建
  • 函數執行結束後消失
  • 包含函數參數和局部變數
  • 是命名空間階層中最深的層級
def add(num1, num2):
  nested_value = 'Inside Function'
  print(num1 + num2)
  print(locals())
add(5, 10)
    

輸出:

15
{'num1': 5, 'num2': 10, 'nested_value': 'Inside Function'}
    

使用 locals() 函數可以查看當前局部命名空間的內容。在函數外部使用 locals() 的效果與 globals() 相同。

封閉命名空間 (Enclosing Namespace)

封閉命名空間是一種特殊的局部命名空間,在使用嵌套函數時創建。

創建條件

當函數內部定義了另一個函數時

存在時間

直到外部函數執行完畢

作用

允許內部函數訪問外部函數的變數

def outer_function():
  outer_value = "outer"
  def inner_function():
    inner_value = "inner"
  inner_function()
  print(locals())
outer_function()

輸出:

{'outer_value': 'outer', 'inner_function': <function outer_function.<locals>.inner_function>}

結語

命名空間 (Namespace) 是 Python 在管理「名稱」時的基礎結構。透過內建、全域、局部與封閉四種命名空間,Python 能夠有效區分不同範圍內的變數與函數,避免混淆與衝突。
理解命名空間,不僅能幫助我們在程式中快速定位名稱,也能建立更清晰的程式架構。

在下一篇文章中,我們將更進一步探索 作用域 (Scope),看看 Python 是如何依序搜尋不同命名空間,並揭開 LEGB 規則 的運作原理。

Colorful python snake coiled around computer code symbols, with name tags floating above various parts of the code

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端