为什么python的列表切片不会产生索引超出范围的错误?

voi*_*urn 12 python string list slice python-2.7

在使用数组切片时,我注意到切片a[index:] or a[:index]类型不会为字符串生成数组索引超出绑定的错误.

str = "abcde"
print str[10:]
print str[:10]
Run Code Online (Sandbox Code Playgroud)

产生输出:

''
abcde
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么?它不应该产生数组索引越界错误?如果我尝试执行以下操作,Python确实会产生此错误:print str[10].

the*_*eye 14

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

但是,如果我们尝试访问列表中大于元素数量的元素,我们就不能返回任何默认值(甚至None因为它可能是列表中的有效值).这就是为什么

IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)

被扔了.

切片时,如果起始索引大于或等于序列的长度,则返回序列的长度设置为0,在此行中

defstop = *step < 0 ? -1 : length;
...
if (r->stop == Py_None) {
    *stop = defstop;
}
...
if ((*step < 0 && *stop >= *start)
    || (*step > 0 && *start >= *stop)) {
    *slicelength = 0;
Run Code Online (Sandbox Code Playgroud)

对于字符串,如果切片后返回的字符串长度为0,则返回一个空字符串,在此行中

if (slicelength <= 0) {
    return PyString_FromStringAndSize("", 0);
}
Run Code Online (Sandbox Code Playgroud)