python切片的奇怪行为

use*_*173 18 python list slice

假设我们有这个列表:

>>> a = [x for x in range(10)]
>>> print(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

另外,切片的两种方式都按预期工作:

>>> a[3:8]
[3, 4, 5, 6, 7]

>>> a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

但是,当合并时:

>>> a[3:8:-1]
[]
Run Code Online (Sandbox Code Playgroud)

我希望它是[7, 6, 5 ,4, 3]或者可能是[6, 5, 4, 3, 2](如果首先发生逆转)。考虑不传递startstop参数时会发生什么也很有趣:

>>> a[:5:-1]
[9, 8, 7, 6]
Run Code Online (Sandbox Code Playgroud)

这几乎是我所期望的,只有一项短。对此进行了测试numpy,它似乎以相同的方式运行。

这里发生了什么?

Car*_*ate 19

a[3:8:-1]
Run Code Online (Sandbox Code Playgroud)

切片的开始和停止位置不会根据步长进行调整。对于负步,您将使其从 3 倒退,但是没有索引在 3 到 8 范围内的元素从 3 开始倒计时,因此您会得到一个空列表。

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

a[8:3:-1]
Run Code Online (Sandbox Code Playgroud)

这将从 8 倒数到 4。


Jea*_*bre 6

a[3:8:-1] 指示python从3开始,以-1的步长到8

这会创建一个空列表:不可能通过添加从 3 达到 8 -1(就像list(range(3,8,-1))它也给出了一个空列表)

当您这样做时,a[:5:-1]start 是默认开始,python 将其设置为“列表结尾”,因此它“有效”

与您执行a[::-1]start 和 stop 时的默认设置相同,python 知道它们是从头到尾的(否则此符号将不可用)