python切片的行为异常

时间:2019-12-02 22:18:25

标签: python list slice

假设我们有以下列表:

>>> 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](如果反转首先发生)。 考虑当未传递startstop参数时会发生什么也很有趣:

>>> a[:5:-1]
[9, 8, 7, 6]

这几乎是我所期望的,只有短一点。用numpy进行了测试,它的行为似乎与此相同。

这是怎么回事?

3 个答案:

答案 0 :(得分:19)

使用

main

切片的开始和停止位置未根据步骤进行调整。负数表示您使它从3向后退,但是没有索引在3到8范围内的元素从3开始倒数,因此您得到一个空列表。

您需要相应地设置开始和停止位置:

f

从8倒数到4。

答案 1 :(得分:6)

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理解它们是从头到尾的(否则该符号将不可用)

答案 2 :(得分:4)

此行为在documentation中进行了说明。

  

从i到j的s切片被定义为索引为k的项序列,使得i <= k      

从i到j的s切片,步骤k ....到达j时停止(但不包括j)。当k为正时,如果i和j较大,则将它们减小为len。当k为负数时,如果i和j较大,则将它们减小为len-1。如果省略i或j或“无”,它们将成为“结束”值(该结束取决于k的符号)。