带有python切片的奇怪行为

问题描述 投票:4回答:3

假设我们有此列表:

>>> 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对此进行了测试,它的行为似乎与此相同。

这里发生了什么?

python list slice
3个回答
5
投票

使用

a[3:8:-1]

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

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

a[8:3:-1]

将从8倒数到4。


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


2
投票

documentation中对此行为进行了解释。

© www.soinside.com 2019 - 2024. All rights reserved.