Python列表Negative indexing工作原理及越界切片无报错问题咨询
Python列表负索引与切片越界行为说明
负索引工作原理
Python的列表支持负索引规则,本质是从列表尾部倒序计数:
- 索引
-1对应列表最后一个元素 - 索引
-2对应列表倒数第二个元素 - 以此类推,任意负索引
n在实际访问时,会被先转换为正索引len(列表) + n再使用
比如你示例中长度为10的列表list1,-1对应的正索引就是10 + (-1) = 9,刚好是最后一个元素的正向下标。
越界切片无报错、返回全列表的原因
Python的切片操作在设计时就允许起止索引超出列表实际下标范围,不会像普通单下标访问那样抛出IndexError,内部会自动对索引做合法化裁剪,规则如下:
- 先将负索引转换为对应的正索引值
- 如果转换后的起始索引小于0,统一裁剪为
0(列表第一个元素的下标) - 如果结束索引大于列表总长度,统一裁剪为
len(列表)(列表切片的结束下标默认是开区间,到这个值就停止) - 裁剪完成后如果起始索引大于等于结束索引,直接返回空列表
对应你给出的示例推导:
测试代码中的list1长度为10,执行list1[-20:20]时:
- 起始索引
-20转换为正索引为10 + (-20) = -10,小于0被裁剪为0 - 结束索引
20大于列表长度10,被裁剪为10 - 最终实际执行的切片逻辑等价于
list1[0:10],所以返回整个列表的全部元素。
内容的提问来源于stack exchange,提问作者Rima
相关产品推荐
相关产品推荐

