Python 切片(Python Slicing)
這篇 Python 切片教學將帶你認識從 List 或字串中「切出一段」的語法。切片是 Python 最具特色的功能之一,一行就能完成取前幾筆、取後幾筆、反轉等操作,語法是 [start:stop:step]。
切片語法
| 參數 | 說明 | 預設值 |
|---|---|---|
start | 起始索引(包含) | 0 |
stop | 結束索引(不包含) | 長度 |
step | 間隔,可為負數 | 1 |
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums[2:5]) # 索引 2 到 4
print(nums[:3]) # 開頭到索引 2(前三個)
print(nums[7:]) # 索引 7 到結尾
print(nums[-3:]) # 最後三個
print(nums[::2]) # 每隔一個取
print(nums[::-1]) # 反轉
執行輸出:
[2, 3, 4]
[0, 1, 2]
[7, 8, 9]
[7, 8, 9]
[0, 2, 4, 6, 8]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
和 range() 一樣記住口訣:含起點、不含終點。
字串切片
字串的切片語法完全相同:
s = "Hello, Python"
print(s[0:5])
print(s[-6:])
print(s[::-1])
執行輸出:
Hello
Python
nohtyP ,olleH
切片不會改變原資料
切片永遠回傳「新的」List 或字串,原本的資料不受影響:
nums = [1, 2, 3, 4, 5]
part = nums[1:4]
part[0] = 999
print(part)
print(nums) # 原 List 不變
執行輸出:
[999, 3, 4]
[1, 2, 3, 4, 5]
用切片複製 List:= 與 copy 的差異
這是 List 最經典的陷阱。= 不是複製,只是兩個名字指向同一份資料:
a = [1, 2, 3]
b = a # 不是複製!a、b 是同一個 List
b[0] = 999
print(a) # a 也被改了
執行輸出:
[999, 2, 3]
要產生獨立的複本,用全範圍切片 [:] 或 copy():
a = [1, 2, 3]
b = a[:] # 切片複製,等同 a.copy()
b[0] = 999
print(a) # a 不受影響
print(b)
執行輸出:
[1, 2, 3]
[999, 2, 3]
注意:[:] 與 copy() 都是「淺拷貝」(shallow copy),如果 List 裡面還包著 List(巢狀結構),內層仍然是共用的,需要 copy.deepcopy() 才能完全獨立。初學階段先記住:單層 List 用 [:] 或 copy() 複製就夠了。
常見錯誤
1. 切片不會報 IndexError
nums[2:100] 超出範圍不會報錯,只會回傳到結尾為止。這個寬容特性方便但也容易藏 bug——範圍寫錯不會有任何錯誤訊息,要自己驗證結果。
2. 把 nums[3] 與 nums[3:4] 搞混
nums[3] 回傳「元素本身」,nums[3:4] 回傳「只有一個元素的 List」。後續要當 List 操作就用切片,要取值就用索引。
3. 用 = 想複製 List
如上節範例,b = a 之後改 b 會動到 a。面試與實務都常見,記住用 [:] 或 copy()。
總結
切片語法 [start:stop:step] 含起點不含終點;[:3] 取前三個、[-3:] 取後三個、[::-1] 反轉;切片回傳新資料、可用 [:] 複製 List,但 = 永遠不是複製。下一篇介紹 List 的「不可變兄弟」:Tuple。