2

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

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

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

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

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

4

2 回答 2

2

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

注意:以下答案来自文章,不是我的。

"

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

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

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'>

请注意,在第一种情况下,正如预期的那样,我们得到一个整数。但是在第二种和第三种情况下,我们得到了一个切片对象。如果需要,我们可以手动创建它们;“slice”与 str、int、dict 和其他收藏夹一起位于“bulitin”命名空间中。正如您从它的打印表示中看到的那样,我们可以将“切片”称为“范围”,就像我们所说的“范围”一样,带有开始、停止和步长参数。

于 2018-07-02T06:02:47.443 回答
0

在 python 3.x 中,字符串索引错误仅针对单个索引。前任-

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

您将在此处获得字符串索引超出范围错误。因为它是针对特定索引的。

但是在切片中,我们可以指定超出范围的索引并且不会给出错误。Ex- string = "uphill" print(string[0:])

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

于 2017-06-09T14:43:43.530 回答