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

标签 string python-3.x slice index-error

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

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

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

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

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

最佳答案

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

关于string - 为什么当我在切片时使用大于 len(string) 的索引号时没有 IndexError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44458245/

相关文章:

python - matplotlib 事件监听器在 PyQT 小部件中不起作用

python - 在 Mac 10.14 上使用 pip 安装 python-igraph 失败并显示 "library not found for -lstdc++"

python - 将迭代器分配给 Python 切片

arrays - slice - 容量/长度?

c# - 是否有 C# 不区分大小写的等于运算符?

java - 从括号中获取字符串的正则表达式?

python - 在python中将文件下载为字符串

Python 3.4 - 列表元素可以进行 str() 而不是 int() 转换

c - 输出到 printf 或 C 上的文件时出现异常的字符串连接

Python 扩展切片与列表 : is the documentation correct?