Python列表负步长索引疑问:指定起止索引为何返回空列表?
为什么Python列表切片
List[0:3:-1]返回空列表? 哈哈,这个切片的坑我当初刚学Python的时候也踩过!其实核心是要搞懂步长为负时,切片的起始和结束位置逻辑和正步长完全相反。
先回忆下Python切片的基本语法:list[start:end:step],不同步长方向下,规则完全不一样:
步长为正(默认情况)
- 从
start指定的索引位置向右(索引增大的方向)取元素 - 一直取到
end指定的索引位置,但不包含end对应的元素 - 如果省略
start,默认从索引0开始;省略end,默认取到列表最后一个元素(索引len(List)-1)
步长为负时
- 从
start指定的索引位置向左(索引减小的方向)取元素 - 一直取到
end指定的索引位置,但不包含end对应的元素 - 如果省略
start,默认从列表最后一个元素(索引len(List)-1)开始;省略end,默认取到列表第一个元素的左边(相当于索引-len(List)-1,确保能包含第一个元素)
分析你的两个例子
你的列表是:List = ["Apple", "Grapes", "Mango", "Papaya"],对应的索引是:
- 0: Apple
- 1: Grapes
- 2: Mango
- 3: Papaya
1. List[::-1]能正常反转的原因
因为省略了start和end,所以:
start默认是3(最后一个元素的索引)end默认是-5(也就是第一个元素的左边,因为len(List)=4,-4-1=-5)- 步长-1,从索引3开始向左取,直到
-5的位置(包含索引0的元素),所以得到['Papaya', 'Mango', 'Grapes', 'Apple'],也就是完整的反转列表。
2. List[0:3:-1]返回空列表的原因
这里你指定了start=0,end=3,步长-1:
- 步长为负,切片需要从
start=0的位置向左取元素,但索引0已经是列表最左边的位置了,左边没有元素 - 更关键的是:步长为负时,
start必须在end的右边(也就是start的索引值要大于end),这样切片才有元素可以取。而你这里start=0的索引小于end=3,方向完全反了,所以切片没有元素可返回,结果就是空列表[]。
正确的手动写法
如果想手动写出等价于List[::-1]的切片,可以这么写:
List[3::-1]:省略end,默认取到最左边,所以从索引3开始向左取所有元素,得到完整反转List[3:-5:-1]:明确指定end=-5(第一个元素左边的位置),效果和上面一样
再给你几个小例子加深理解:
List[3:0:-1]→ 得到['Papaya', 'Mango', 'Grapes'](因为end=0,不包含索引0的元素)List[2::-1]→ 得到['Mango', 'Grapes', 'Apple'](从索引2开始向左取到最左边)
内容的提问来源于stack exchange,提问作者Paris
相关产品推荐
相关产品推荐

