为什么 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 中的字符串时,务必注意此行为,以避免出现意外结果。