为什么Python的列表切片不产生越界错误?

15 投票
2 回答
8028 浏览
提问于 2025-04-18 01:57

在玩数组切片的时候,我发现用 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);
}

撰写回答