Python 變數是參考還是值?用實驗帶你看懂

在學習 Python 的過程中,常常有人會問:
  • Python 變數是 傳值 (by value) 還是 傳參考 (by reference)?
  • 為什麼有時候改變一個變數,另一個也跟著變了?
  • 為什麼 += 和 + 看似相同,卻會造成不同結果?

本文將用一段簡單程式碼,帶你理解 Python 的 變數綁定機制 以及 mutable vs immutable 的差異。

在 Python 中,所有東西都是物件 (object)。
變數只是「名稱 (name) → 物件 (object)」的綁定。
本質上永遠是 reference,但行為會因 mutable 或 immutable 而不同。
Immutable 型別:int, float, str, tuple …
不可變,任何修改都會生成新物件。
Mutable 型別:list, dict, set, 自訂 class …
可變,修改會直接影響同一個物件。

以下是程式範例:
a = [1]
print(a)

b = a
print(type(a), type(b))
print(a, b)
print(id(a), id(b))

b += [2]
print(a, b)
print(id(a), id(b))

b.append(3)
print(a, b)
print(id(a), id(b))

b = b + [4]
print(a, b)
print(id(a), id(b))

而你可以觀察到 print 出來的結果會是:

>>> [1]
>>> <class 'list'> <class 'list'>
>>> [1] [1]
>>> 139702957538944 139702957538944
>>> [1, 2] [1, 2]
>>> 139702957538944 139702957538944
>>> [1, 2, 3] [1, 2, 3]
>>> 139702957538944 139702957538944
>>> [1, 2, 3] [1, 2, 3, 4]
>>> 139702957538944 139702956810624

解析以上輸出:

b = a
a 和 b 指向同一個 list,id 相同。
b += [2]
就地修改 (in-place operation),不會產生新物件。
所以 a 和 b 都變成 [1, 2]。
b.append(3)
同樣是就地修改,兩者一起變成 [1, 2, 3]。
b = b + [4]
這是 生成新物件再重新綁定 的行為。
b 被分配到新 id,不再和 a 共享。
因此 a = [1, 2, 3],b = [1, 2, 3, 4]。

結論:

Python 的變數 永遠是 reference。
Mutable 與 Immutable 的差異,會影響到「修改」時的行為。
+= 會修改原物件(就地操作),+ 會產生新物件。
在設計程式時,要小心「共享物件」的副作用,必要時可用 copy 或 deepcopy。


留言

這個網誌中的熱門文章

Class Variables 演練與變數記憶體關係範例