为什么Python的列表切片不产生越界错误?
在玩数组切片的时候,我发现用 a[index:] 或 a[:index]
这种方式切片时,字符串不会出现数组索引越界的错误。
str = "abcde"
print str[10:]
print str[:10]
输出结果是:
''
abcde
有人能解释一下为什么吗?难道不应该出现数组索引越界的错误吗?不过,如果我尝试像这样做:print str[10]
,Python确实会报这个错。
2 个回答
1
这就是在Python中切片操作符是怎么实现的。如果数组的索引超出了范围,它会自动在合适的位置截断。
17
切片是用来创建一个新列表的。如果你指定的索引超出了列表中元素的范围,我们可以返回一个空列表。所以,这样就不需要报错了。
但是,如果我们尝试访问列表中超过元素数量的索引,就不能返回任何默认值(甚至不能返回None
,因为它可能在列表中是一个有效的值)。这就是为什么会出现
IndexError: list index out of range
的原因。
在切片的时候,如果起始索引大于或等于序列的长度,那么返回的序列长度会被设为0,这在这一行中有说明。
defstop = *step < 0 ? -1 : length;
...
if (r->stop == Py_None) {
*stop = defstop;
}
...
if ((*step < 0 && *stop >= *start)
|| (*step > 0 && *start >= *stop)) {
*slicelength = 0;
对于字符串来说,如果切片后返回的字符串长度为0,那么它会返回一个空字符串,这在这一行中有说明。
if (slicelength <= 0) {
return PyString_FromStringAndSize("", 0);
}