为什么在切片时使用大于 len(string) 的索引号时没有 IndexError?

Why is there no IndexError when I use index numbers larger then len(string) while slicing?

当我使用大于字符串长度的索引号时,我在 Python 中理所当然地得到一个 IndexError,例如:

string = "uphill"  
print(string[12])

但是如果我对字符串进行切片,使用大于字符串的索引号似乎是可以的,因为以下代码不会创建 IndexError:

string = "uphill"
print(string[0:12])

为什么会这样?这对我来说似乎相当含蓄,因为我希望在这种情况下也会出现 IndexError 。如果这很明显,我很抱歉,但我找不到任何相关的东西。

在python 3.x 字符串索引错误只给出了个别索引而已。 前

string = "uphill"
print(string[12])

你会在这里得到字符串索引超出范围的错误。因为它是针对特定索引的。

但是在切片中我们可以指定超出范围的索引并且不会报错。 前任- 字符串 = "uphill" 打印(字符串[0:])

Python 打印范围内的字符。要给出错误,用户必须知道字符串的长度。为此,您可以使用 len() 函数。

我在这篇文章中找到了对这个问题的很好解释的答案: http://blog.lerner.co.il/python-parentheses-primer/

注:以下答案来自文章,非本人

如果您请求超出序列边界的单个索引,您可能会得到 IndexError 异常。但是切片没有这样的问题;他们只会停在你的字符串的开头或结尾。 ... 方括号如何区分单个索引和切片?答案是:他们没有。在这两种情况下,都会调用 getitem 方法。由 getitem 来检查它为“索引”参数获取了什么样的值。

但等等:如果我们将整数或字符串(甚至元组)传递给方括号,我们知道将传递什么类型。如果我们使用切片,将什么类型传递给我们的方法?

In [55]: class Foo(object):
...:         def __getitem__(self, index):
...:             print(f"index = {index}, type(index) = {type(index)}")
...:


In [56]: f = Foo()

In [57]: f[100]
index = 100, type(index) = <class 'int'>

In [58]: f[5:100]
index = slice(5, 100, None), type(index) = <class 'slice'>

In [59]: f[5:100:3]
index = slice(5, 100, 3), type(index) = <class 'slice'>

请注意,在第一种情况下,正如预期的那样,我们得到了一个整数。但是在第二种和第三种情况下,我们得到了一个切片object。如果需要,我们可以手动创建这些; “slice”在“bulitin”命名空间中,还有 str、int、dict 和其他收藏夹。正如您从其打印表示中看到的那样,我们可以像调用“范围”一样调用“切片”,使用开始、停止和 step-size 参数。