假设我们有此列表:
>>> a = [x for x in range(10)]
>>> print(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
另外,两种方式都可以按预期方式进行切片:
>>> a[3:8]
[3, 4, 5, 6, 7]
>>> a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
但是,当组合时:
>>> a[3:8:-1]
[]
我希望它是[7, 6, 5 ,4, 3]
或[6, 5, 4, 3, 2]
(如果首先发生反转)。考虑未传递start
或stop
参数时发生的情况也很有趣:
>>> a[:5:-1]
[9, 8, 7, 6]
这几乎是我所期望的,只有一个简短。用numpy
对此进行了测试,它的行为似乎与此相同。
这里发生了什么?
使用
a[3:8:-1]
切片的开始和停止位置未根据步骤进行调整。负的步长使它从3向后退,但是没有索引的范围从3倒数为3到8的元素,因此您得到一个空列表。
您需要相应地设置开始和停止位置:
a[8:3:-1]
将从8倒数到4。
[a[3:8:-1]
指示python从3开始并以-1的步长升至8]]
这将创建一个空列表:通过添加-1
不可能从3达到8(就像list(range(3,8,-1))
也会给出一个空列表)
[当您执行a[:5:-1]
时,start是默认的开始,它将python设置为“ list of end”,因此它可以“运行”
与执行a[::-1]
时一样,开始和停止是默认值,并且python理解它们是从头到尾的(否则该符号将不可用)
documentation中对此行为进行了解释。