為什麼 Python 中的子字串切片索引超出範圍仍然可以工作?


切片是 Python 中用於提取序列(例如字串、列表或元組)一部分的技術。切片涉及指定序列的起始和結束索引,生成的切片將包含從起始索引到(但不包括)結束索引的所有元素。

Python 中的切片使用方括號 [] 表示,並提供由冒號 ‘:’ 分隔的起始和結束索引。如果省略起始索引,則假定為 0,如果省略結束索引,則假定為序列的長度。

例如,假設我們有一個包含單詞“Python”的字串 text

要使用切片提取此字串的前三個字元,我們可以使用以下程式碼

示例

text = "Python"
first_three = text[0:3]
print(first_three)

輸出

Pyt

我們還可以使用**切片中的負索引**從序列的末尾開始計數。例如,要提取字串 text 的最後兩個字元,我們可以使用以下程式碼

這裡,text[−2:] 表示“獲取字串 text 的從倒數第二個字元開始到字串末尾的切片”。

示例

text = "Python"
last_two = text[-2:]
print(last_two)

輸出

on

切片還可以用於從序列中提取每第 n 個元素。例如,要從字串 text 中提取每隔一個字元,我們可以使用以下程式碼

這裡,text[::2] 表示“獲取字串 text 的從字串開頭到字串末尾的切片,但只包含每隔一個字元”。

示例

text = "Python"
every_other = text[::2]
print(every_other)

輸出

Pto

在 Python 中,使用超出範圍的索引切片子字串不會導致錯誤。相反,它將返回空字串或部分子字串,具體取決於情況。這乍一看可能很奇怪,但在某些情況下它可能很有用。

以下是一些示例,有助於解釋為什麼它可以工作

使用超出範圍的起始索引進行切片

示例

在此示例中,我們從索引 20 開始切片字串 text。由於 text 的長度只有 11 個字元,因此索引 20 處沒有字元。Python 不會報錯,而是返回一個空字串。

text = "Lorem Ipsum"
substring = text[20:]
print(substring) 

使用超出範圍的結束索引進行切片

示例

在此示例中,我們正在將字串 text 切片到索引 20。由於 text 的長度只有 12 個字元,因此沒有足夠的字元到達索引 20。Python 不會報錯,而是返回整個字串。

text = "Lorem Ipsum"
substring = text[:20]
print(substring)  

輸出

Lorem Ipsum

使用超出範圍的步長索引進行切片

示例

在此示例中,我們使用步長索引 20 切片字串 text。由於字串中沒有足夠的字元來完成 20 的完整步長,因此 Python 返回部分子字串。

text = "Lorem Ipsum"
substring = text[::20]
print(substring)  

輸出

L

示例

在此示例中,我們嘗試從索引 3 切片到 15 的子字串,但字串 text 只有 11 個字元。但是,Python 不會引發錯誤,而是返回從索引 3 到字串末尾的子字串。

text = "Lorem Ipsum"
substring = text[3:15]
print(substring)

輸出

em Ipsum

示例

在此示例中,我們嘗試從索引 15 切片到 20 的子字串,但字串 text 只有 11 個字元。由於結束索引超出範圍,Python 返回一個空字串。

text = "Lorem Ipsum"


substring = text[15:20]
print(substring)

示例

在此示例中,我們嘗試從索引 −5 切片到 15 的子字串。Python 中的負索引從字串末尾開始計數,因此 −5 指的是字串末尾的第 5 個字元。由於起始索引在範圍內,而結束索引超出範圍,因此 Python 返回從起始索引到字串末尾的子字串。

text = "Lorem Ipsum"
substring = text[-5:15]
print(substring)

輸出

Ipsum

總而言之,使用超出範圍的索引進行切片不會在 Python 中導致錯誤,因為這在某些情況下可能很有用。但是,在使用 Python 中的字串時,務必注意此行為,以避免出現意外結果。

更新於: 2023-08-11

3K+ 閱讀量

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.