Python列表负索引反向切片返回空列表的原因及包含0元素的实现咨询
Python列表负索引反向切片返回空列表的原因及包含0元素的实现咨询
嘿,我来帮你把这个切片的问题捋明白~
首先咱们先搞清楚为什么 nums[slice(5,-1,-1)] 会返回空列表:
Python 的切片规则里,当步长(step)为负数时,切片是从起始索引(start)开始,朝着索引减小的方向遍历,直到**超过结束索引(stop)**的时候停止。这里你用的 stop 是 -1,在 Python 里 -1 对应的是列表最后一个元素的索引(也就是你这个列表里的 23)。你的起始索引是 5,索引 5 的位置在列表前面,远小于 -1 对应的实际索引位置,所以从 5 往索引减小的方向走,永远碰不到 -1 的位置,自然就返回空列表啦。
那想要反向切片并包含 0 元素,该怎么做呢?有两个简单的方法:
- 方法一:把结束索引设为
None,这样步长为负时,切片会一直取到列表的开头(包含索引 0)。比如:nums[slice(5, None, -1)] # 结果是 [5, 4, 3, 2, 1, 0] - 方法二:直接用更简洁的切片语法,省略结束索引(本质和上面的
slice(5, None, -1)等价):nums[5::-1] # 同样得到 [5, 4, 3, 2, 1, 0]
再顺便解释下你之前用的 nums[slice(5,0,-1)] 为什么不包含 0:
切片的规则是左闭右开的,哪怕步长为负也是如此。这里的结束索引是 0,意味着切片会从 5 开始往小索引走,取到索引 1 就停了(因为不包含索引 0),所以结果是 [5,4,3,2,1]。
总结下核心要点:
- 当步长为负时,起始索引的实际位置必须大于结束索引的实际位置,切片才会有元素;如果起始位置比结束位置更靠前(索引值更小),就会返回空。
- 要包含列表第一个元素(索引 0)的反向切片,直接把结束索引设为
None或者省略它就行~
备注:内容来源于stack exchange,提问作者ocelto




