Python 切片 (Slicing)

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。

延伸閱讀