python slice运算符:负开始与正停止组合

Python Slice operator: Negative start combined with Positive stop

我开始使用python,并开始关注带有负值的切片操作符。让我用下面的代码示例说明我的问题:

1
2
3
a = [1,2,3,4,5]
a[-1]  # a) returns [5], which is obvious
a[-1:1]  # b) returns an empty list [], but why?

所以我已经从StackOverflow的其他问题中了解到,切片如何处理负的开始索引和省略的停止索引。

但我的问题是:为什么案例B(负启动和正停止)没有返回像[5, 1]这样的内容?因为我选择了列表的最后一个元素以及第二个元素之前的所有元素,所以这样做是有意义的。

如果有人能向我解释,我会很高兴的。谢谢!


python列表呈线性增长,并且不是循环的,因为这样的切片不会像您期望的那样进行换行(从结束到开始)。

由于负指数读作-ind + len(lst),这里的-1代表4。你不可能以积极的步伐从4迈到1。但是,如果步幅不好,您可以:

1
2
In [11]: a[-1:1:-1]
Out[11]: [5, 4, 3]

虽然允许使用负索引,但python的步幅不是循环的,这意味着您不能"超越"最后一个索引。也就是说,"从最后一个元素到第一个元素"都是无稽之谈。您可能会认为这会导致错误,但返回的却是空列表[]

解决方法是使用消极的步幅,如:

1
a[5::-4]  # results in [5, 1]

在这里,我们从第5个元素开始,继续执行所有元素(两个::之间没有数字)和跳转-4(由于减号而向后)元素。