问题 为什么python的列表切片不会产生索引超出范围的错误? [重复]


这个问题在这里已有答案:


9570
2018-04-09 01:16


起源

@senderle:谢谢指针 - tejas


答案:


切片用于创建新列表。如果索引不在列表中元素数量的范围内,我们可以返回一个空列表。所以,我们不必抛出错误。

但是,如果我们尝试访问列表中大于元素数量的元素,我们就不能返回任何默认值(甚至不是 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,则返回一个空字符串in 这条线

if (slicelength <= 0) {
    return PyString_FromStringAndSize("", 0);
}

13
2018-04-09 01:21





这就是切片运算符在python中实现的方式。如果数组索引超出范围,它将自动截断,然后在正确的位置。


1
2018-04-09 01:19