在 Python 中,幾乎所有程式的行為都圍繞著「名稱」與「對象」之間的關係展開。
當你撰寫一行簡單的 x = 5
時,其實背後涉及到的是「名稱如何被儲存」、「在哪裡能被找到」,以及「程式如何知道應該使用哪個值」。
這些問題的答案,就隱藏在 命名空間(Namespace) 與 作用域(Scope) 的概念之中。
理解它們,能幫助你避免常見錯誤,並寫出更清晰、更具結構性的程式碼。
什麼是命名空間 (Namespace)?
命名空間是名稱及其引用對象的集合。Python 使用字典來存儲這些信息,其中鍵是已定義的名稱,值是這些名稱引用的對象。
目的
區分程式中的不同對象,避免名稱衝突
結構
以字典形式存在,鍵是名稱,值是對象
例子
{'color': 'cyan'}
當我們使用 print(color)
時,Python 會在相應的命名空間中尋找名為 color 的鍵,並提供其值用於我們的程式。
Python 的四種命名空間
Python 依層級劃分四種命名空間:
- 內建命名空間 (Built-in Namespace)
- 由 Python 解譯器啟動時建立,程式結束時消失
- 包含
print()
、len()
、int
、list
、ValueError
等 - 可用
dir(__builtins__)
查看所有名稱
- 全域命名空間 (Global Namespace)
- 由模組建立,包含在頂層定義的變數、函數與匯入的模組
- 直到程式結束才會消失
- 可用
globals()
查看
- 封閉命名空間 (Enclosing Namespace)
- 嵌套函數時建立,內部函數可訪問外部函數的變數
- 外部函數無法訪問內部函數的變數
- 局部命名空間 (Local Namespace)
- 呼叫函數時建立,包含函數的參數與區域變數
- 函數執行結束後消失
- 可用
locals()
查看

內建命名空間 (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 程式中都可以直接使用,不需要額外導入。

全域命名空間 (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 規則 的運作原理。
