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

问题描述 投票:0回答:2

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

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

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

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

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

string python-3.x slice index-error
2个回答
3
投票

我在这篇文章中找到了这个问题的很好解释的答案: https://lerner.co.il/2018/06/08/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” 位于“bulitin” 命名空间中,其他命名空间还有 str、int、dict 和其他常用命名空间。正如您从其打印表示中看到的那样,我们可以像调用“范围”一样调用“切片”,并带有开始、停止和步长参数。


0
投票

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

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

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

但是在切片时我们可以指定超出范围的索引并且不会给出错误。 前任- 字符串=“上坡” 打印(字符串[0:])

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

© www.soinside.com 2019 - 2024. All rights reserved.