HOWTO · Python

Python 中 `[:-1]` 的意義

了解 Python 的 `[:-1]` 切片如何傳回不含最後一個元素的序列。

本頁內容

在 Python 中,sequence[:-1] 會傳回一個新的序列,其中包含除了最後一個元素之外的每個元素。它適用於字串和清單,且不會改變原始序列。這個運算式將切片與 -1 結合,-1 在從末尾進行索引時標識最後的位置。

Python 中的切片

Python 提供兩種等價的方式來描述切片:slice() 建構函式和索引語法。一般形式是 sequence[start:stop:step];每個部分選取從何處開始、在何處停止,以及前進多遠。start 和 stop 邊界標識位置,而 step 控制方向和間距。

停止位置被排除在外。在索引 4 結束的切片包含 4 之前的位置,因此 sequence[1:4] 選取索引 1、2 和 3。索引可以從末尾計數:-1 指最後一個元素,-2 指其前一個元素。省略的邊界不同於明確寫出 -1:在通常的正步長下,省略的 start 從序列的開頭開始,省略的 stop 繼續到其末尾。預設值取決於步長的方向。在負步長下,遍歷從右向左移動;省略的 start 從最後的位置開始,而省略的 stop 繼續超過第一個位置。這種依方向而定的行為,正是省略的 stop 不同於明確寫出 -1 的原因。

建構函式接受相同的部分:slice(start, stop, step)。與索引語法不同,你不能將建構函式參數留空;用 None 表示省略的邊界。例如,slice(None, 5) 使用省略的 start 和為 5 的 stop,對於正步長而言等同於 sequence[:5]。使用一個參數時,slice(5) 將 stop 設為 5;它並不表示「從索引 5 開始」。當切片必須作為值儲存或傳遞時,這些形式很有用。

Python 中 [:-1] 的意義

在 sequence[:-1] 中,start 被省略,因此切片從開頭開始。stop 是 -1,它標識最後一個元素,並且由於 stop 被排除,該元素不會被複製到結果中。例如,將其套用到 "Python" 會得到 "Pytho";將其套用到 ["red", "green", "blue"] 會得到 ["red", "green"]。

同一個運算式可以套用到不同的序列類型,並得到相同的結果模式。這個獨立完整的範例使用一個短字串和一個顏色名稱清單,然後將每個切片值顯示在各自的行上。輸入值讓人容易看出哪個最後項目被省略,而列印出的值顯示原始資料仍可供程式稍後使用。

word = "Python"
colors = ["red", "green", "blue"]

print(word[:-1])
print(colors[:-1])
Pytho
['red', 'green']

切片會建立一個結果,而不是改變原始序列。這使得 [:-1] 在你需要一個不含最後字元或項目的版本、但稍後仍需要原始值時很有用。它也適用於空序列,會傳回另一個空序列。對於只有一個元素的序列,結果為空,因為其唯一的元素就是最後一個元素。同一個 stop 邊界規則解釋了這兩個結果。