Python列表使用[起始:结束:-1]切片返回空列表的原因是什么?
Python 带步长参数的列表切片逻辑详解
切片核心运行逻辑
Python 列表切片的完整语法为 [start:stop:step],运行时遵循以下规则:
- 首先根据
step的正负确定遍历方向:step>0为从左到右遍历,step<0为从右到左遍历 - 从
start对应的索引位置开始取值,每次按step调整当前索引,直到当前索引越过stop对应的边界时停止,所有中途取到的元素组成最终切片结果 start和stop的默认值随遍历方向动态变化:- 从左到右(step>0):
start默认为0(列表第一个元素索引),stop默认为列表长度(列表末尾元素的下一个位置),遍历停止条件为「当前索引 ≥ stop」 - 从右到左(step<0):
start默认为len(列表)-1(列表最后一个元素索引),stop默认为-1(列表第一个元素的前一个位置),遍历停止条件为「当前索引 ≤ stop」
- 从左到右(step>0):
- 注意不存在「start必须小于stop」的固定规则,只要start的位置在遍历方向上位于stop之前,就能取到非空结果
疑问1:为什么list[0:len(list)+1:-1]返回空列表
这里step=-1,遍历方向为从右到左,停止条件为当前索引 ≤ stop。
你指定的start=0,stop=len(list)+1,初始的当前索引是0,0远小于len(list)+1,还没开始遍历就已经满足停止条件,所以返回空列表。
平时我们写list[::-1]能得到逆序列表,是因为没有指定start和stop时,会用step<0对应的默认值:start=len(list)-1,stop=-1,从最后一个元素往左遍历到第一个元素为止,自然能拿到全部逆序元素。
而list[0:len(list)+1]是step默认等于1的正向遍历,start=0 ≤ stop,所以能正常拿到完整列表,不能直接把正向的起止参数套用到负步长的场景。
疑问2:为什么l[2:5:-1]返回空,l[2:5][::-1]却正常
以示例列表 l = [0,1,2,3,4,5] 为例:
- 先看
l[2:5:-1]:step=-1是反向遍历,初始当前索引为2,stop=5,2 ≤ 5直接满足停止条件,所以返回空列表。
要一步得到[4,3,2]的结果,反向遍历时要把start设为你要的第一个元素的索引(也就是4,对应元素4),stop设为你要的最后一个元素索引的前一个值(最后一个要的元素是索引2对应的值2,所以stop设为1,保证索引2 > 1不会被提前停止),正确写法为l[4:1:-1]。 - 再看
l[2:5][::-1]:这是两次切片操作,第一次是正向切片l[2:5],step默认1,拿到索引2、3、4对应的元素[2,3,4],第二次对这个新列表做反向切片[::-1],自然得到逆序结果[4,3,2]。
内容的提问来源于stack exchange,提问作者Utkarsh Pant
相关产品推荐
相关产品推荐

