为什么Python中字符串切片索引超出范围仍然有效?


切片是Python中用于提取序列(例如字符串、列表或元组)一部分的技术。切片涉及指定序列的起始和结束索引,生成的切片将包含从起始索引到(但不包括)结束索引的所有元素。

Python中的切片用方括号[]表示,并提供用冒号“:”分隔的起始和结束索引。如果省略起始索引,则假定为0;如果省略结束索引,则假定为序列的长度。

例如,假设我们有一个包含单词“Python”的字符串text

要使用切片提取此字符串的前三个字符,我们可以使用以下代码

示例

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

输出

Pyt

我们还可以使用**切片中的负索引**从序列的末尾开始计数。例如,要提取字符串text的最后两个字符,我们可以使用以下代码

此处,text[−2:]表示“获取从倒数第二个字符开始到字符串末尾的字符串切片”。

示例

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

输出

on

切片还可以用于从序列中提取每第n个元素。例如,要从字符串text中提取每隔一个字符,我们可以使用以下代码

此处,text[::2]表示“获取从字符串开头到字符串结尾的字符串切片,但只包含每个第二个字符”。

示例

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年8月11日

3K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告