为什么string切片索引超出范围在Python中工作?

为什么'example'[999:9999]不会导致错误? 既然'example'[9] ,那么背后的动机是什么呢?

从这个行为中,我可以假设'example'[3]本质上是/内部的,与'example'[3:4] ,即使两个结果都是相同的'm'string。

你基本上回答了你自己的问题。 在序列的边界之外切片(至less对于内置插件)不会导致错误。 当你考虑这个问题时,这是有道理的。 索引返回单个项目,但切片返回项目的子序列。 所以当你试图索引一个不存在的值时,没有什么可以返回的。 但是当你在边界之外切片时,你仍然可以返回一个空的序列。

还要注意, x[3]x[3:4]之间通常存在差异。 例如:

 >>> [0, 1, 2, 3, 4, 5][3] 3 >>> [0, 1, 2, 3, 4, 5][3:4] [3] 

在string的情况下,他们看起来是一样的,因为在string之外不存在单个字符。 一个字符只是一个1个字符的string。

为了增加一个答案,指向文档中的健壮的部分:

给定像s[i:j:k]这样s[i:j:k]片段expression式,

步骤k从i到j的切片被定义为具有索引x = i + n * k的项目的序列,使得0 <= n <(ji)/ k。 换句话说,指数是i,i + k,i + 2 * k,i + 3 * k等等,到达j时停止(但不包括j)。 当k是正数时,如果它们更大,那么i和j会减less到len(s)

如果你写了s[999:9999] ,由于len(s) < 999且你的步骤是肯定的( 1默认值),python会返回s[len(s):len(s)]

切片不是由内置types进行边界检查的。 虽然你们的两个例子看起来都有相同的结果,但他们的工作方式不同。 尝试用列表来代替。