为什么 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+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告