以a = [1,2,3,4,5]
为例。根据我的直觉,我认为 a[::-1]
与 a[0:len(a):-1]
相同。但结果是错误的:
>>> a = [1,2,3,4,5]
>>> print a[::-1]
[5, 4, 3, 2, 1]
>>> print a[0:len(a):-1]
[]
>>> print a[0:3:-1]
[]
>>> print a[0:2:-1]
[]
>>> print a[:2:-1]
[5, 4]
>>> print a[:0:-1]
[5, 4, 3, 2]
>>> print a[0:-1]
[1, 2, 3, 4]
我实际上无法理解最后 6 次尝试的输出。谁能给我一些想法?非常感谢。
要使用的语法是 [start:end:step]
,其中 end 不包含在内。
Python 遵循一些基于可能意思的规则(它们可能不是你的意思,但在这种情况下语言设计者拥有最终投票权)。我们将进一步了解具体规则。
a[::-1]
是反转列表的快捷方式。如果我们说要无限制地向后工作,我们可能的意思是从末尾移动到开始。
a[0:len(a):-1]
表示从 0 开始,到 -1 到 len(a)。请注意,这是不可能的(我们最终会得到无数个负数),因此结果为空。 a[0:3:-1]
和a[0:2:-1]
有同样的问题。
在最后一个例子中,a[0:-1]
,负一索引表示最后一个元素。你可能的意思是从头到尾。请注意,终点不包括在内。这给出了除最后一个元素之外的所有元素(也可以指定为 a[:-1]
)。
使用 a[:2:-1]
,您指定向后移动,因此您可能的意思是从最后一个元素向后移动到第 2 个索引。这在您的示例中给出了 [5,4]
。 a[:0:-1]
的情况类似,但移动发生在开头,给出 [5,4,3,2]
。
引用cpython source code ,我们可以看到实际的规则。
- 如果不给step,则等于1
- 如果未给出起始值,如果步长不为负,则选择默认起始值为 0,如果为负,则选择长度 -1
- 如果未给出结束值,如果 step 不是负数,则选择默认结束作为长度,如果是,则选择 -1(这些值允许保留最后一个元素,知道结束点是非包含的)<
如果给定了起始值和结束值,则进行一些调整
- 如果小于0,则增加长度
- 如果仍然小于0,步长非负则设置为0,否则设置为-1
- 如果大于或等于长度,如果步长为负,则将其设置为比长度小一,否则等于长度
请注意,在大多数情况下,规则确定可以准确给出以获得等效形式的值。异常(exception)情况是默认规则确定起点或终点为 -1。如果我们给出那个值,修改值的规则就会改变它。
应用这些规则我们得到
a[::-1]
使用长度为 1 的开始(默认)、-1 的结束(默认)和 -1 的步长
a[0:len(a):-1]
、a[0:3:-1]
和 a[0:2:- 1]
使用给定的值
a[:0:-1]
使用长度为 1 的开始(默认)、0 的结束和 -1 的步长
a[:2:-1]
使用长度为 1 的开始(默认)、2 的结束和 -1 的步长
a[0:-1]
使用 0 开始,length-1 结束(修改),步长 1(默认)
此时,我们可以确定是否可以进行选择。在空的情况下,由于 step 为负且 start