Python列表反向切片无法获取首元素 切片设计逻辑疑问咨询
Python切片的设计逻辑与反向切片包含首个元素的方法
一、核心设计规则
Python切片的逻辑全程统一,不存在正向/反向两套规则,核心遵循以下3条:
- 所有索引(包括负索引)都会先转换为对应正索引:对于长度为
n的列表,负索引-i等价于n + i,超出合法范围的索引会被自动截断到有效边界[0, n]区间 - 切片区间永久遵循左闭右开规则,永远不会包含结束索引对应的元素
- 步长的正负决定遍历方向,停止判断逻辑和方向绑定:
- 步长为正:从起始索引开始每次加步长,只要当前索引 < 结束索引就保留元素,否则停止
- 步长为负:从起始索引开始每次加步长(即数值递减),只要当前索引 > 结束索引就保留元素,否则停止
二、测试结果不符合预期的原因
测试用的列表a = [0,1,2,3,4]长度为5,按照上面的规则可以完全解释所有测试结果:
a[4:-1:-1]:-1转换为正索引是5 + (-1) = 4,等价于a[4:4:-1],起始和结束索引相同,没有符合条件的元素,因此返回空列表a[4:-2:-1]:-2转换为正索引是5 + (-2) = 3,等价于a[4:3:-1],左闭右开区间仅包含索引4对应的元素,因此返回[4]
三、反向切片包含首个元素的实现方法
要反向遍历到索引0的元素,需要让结束索引转换后的值小于0,最简洁规范的写法是省略结束索引,此时Python会根据负步长自动将结束边界设为小于0的有效值,可以完整包含首个元素:
a = [0,1,2,3,4] # 标准写法:省略结束索引 print(a[4::-1]) # 输出 [4, 3, 2, 1, 0] # 也可以传入小于-n的结束索引实现,可读性较差不推荐 print(a[4:-6:-1]) # 输出 [4, 3, 2, 1, 0]
内容的提问来源于stack exchange,提问作者Jilong Yin
相关产品推荐
相关产品推荐

