Python Tuple

Python Tuple(Python Tuple)

這篇 Python Tuple 教學將帶你認識元組(Tuple):一個和 List 很像、但建立後不能修改的容器。看起來像是功能比較少的 List,但「不可變」正是它的價值——適合存放不應該被改動的資料,例如座標、設定值、函式回傳的多個值。

Tuple 與 List 差異比較

比較項目TupleList
符號(1, 2, 3)[1, 2, 3]
可否修改不可(immutable)可(mutable)
適用情境固定不變的資料會增刪改的資料
可當 dict 的 key可以不行
效能略快、省記憶體較彈性

建立 Tuple

用小括號 () 建立,其實逗號才是重點,括號可省略:

point = (3, 5)
rgb = 255, 128, 0        # 不加括號也是 Tuple
single = (42,)           # 單元素一定要逗號!

print(point)
print(type(rgb))
print(type(single))

執行輸出:

(3, 5)
<class 'tuple'>
<class 'tuple'>

索引與切片的用法和 List 完全相同:

point = (3, 5)
print(point[0])
print(point[-1])

執行輸出:

3
5

但嘗試修改就會報錯:

point = (3, 5)
point[0] = 10

執行輸出:

TypeError: 'tuple' object does not support item assignment

Tuple 解包(Unpacking)

把 Tuple 的元素一次拆給多個變數,是 Python 非常常用的寫法:

point = (3, 5)
x, y = point          # 解包
print(f"x={x}, y={y}")

# 其實多重指派、交換變數就是 Tuple 解包
a, b = 1, 2
a, b = b, a
print(a, b)

執行輸出:

x=3, y=5
2 1

函式一次回傳多個值,本質上也是回傳 Tuple(第 19 篇函式會再看到)。

Tuple 與 List 互轉

t = (1, 2, 3)
lst = list(t)     # Tuple → List,變成可修改
lst.append(4)
t2 = tuple(lst)   # List → Tuple

print(t2)

執行輸出:

(1, 2, 3, 4)

常見錯誤

1. TypeError: ‘tuple’ object does not support item assignment

對 Tuple 的元素指派新值。Tuple 不可修改,需要修改就先 list() 轉成 List。

2. 單元素 Tuple 忘記逗號

(42) 只是被括號包住的數字 42,不是 Tuple;(42,) 才是。這是 Tuple 最經典的陷阱。

3. ValueError: too many values to unpack

解包時變數數量與元素數量不一致,例如 x, y = (1, 2, 3)。變數個數要對齊,或用 x, *rest = (1, 2, 3) 把剩餘的收進 List。

總結

Tuple 是不可變的 List:() 建立、單元素要逗號、索引切片用法相同但不能修改;解包讓多變數指派非常優雅。原則很簡單——資料不該變就用 Tuple,會變就用 List。下一篇介紹查詢速度極快的 Dictionary。

延伸閱讀