为什么第一个输出包含第一个元素(在我看来好像是好行为,因为它以0
索引(即第一个元素)开头,然后以len(a)-1
递增(最后一个元素) ))。
问题是第二个例子(如果它始终以零索引开始然后递增)应该是[1, 5, 4, 3, 2]
,或者?
输出1: [1, 5]
输出2: [5, 4, 3, 2, 1]
a = [1, 2, 3, 4, 5]
print(a[::len(a)-1])
print(a[::-1])
答案 0 :(得分:4)
切片中的最后一个参数是步长值。如果步骤为正,则从0开始,如果步骤为负,则从-1开始。 Relevant piece of code from sliceobject.c
,
defstart = *step < 0 ? length-1 : 0;
所以,当你说
时a[::-1]
并且由于步骤为负,它只是从最后一个元素开始。它继续将索引递增-1并返回生成的列表。所以,它基本上颠倒了这个清单。
但是,当你说
时a[::len(a)-1]
步长值为4.由于步长为正,它从第一个元素开始,即1
,并将索引增加4并选择索引4处的元素(初始索引(0)+4 = 4),即5.这就是返回[1, 5]
的原因。
答案 1 :(得分:2)
你所拥有的是extended slices
无论你在::
之后提到的是你要添加到0
索引元素的步长值
所以
>>> print(a[::len(a)-1])
[1, 5]
基本上是
>>> print(a[::4)
[1, 5]
获取0
元素并将4添加到索引中并获取下一个元素。
负数的类似行为。
>>> print(a[::-1)
[5, 4, 3, 2, 1]
将-1
添加到索引(或从索引中减1),使其成为0-1
或5
(数组中的最后一个元素)。
答案 2 :(得分:2)
以下是python list切片的工作原理:
a[start:end] # items start through end-1
还有步骤值,可以与上述任何一个一起使用:
a[start:end:step] # start through not past end, by step
另一个特性是开始或结束可能是负数,这意味着它从数组的末尾而不是从开头开始计数。所以:
a[-1] # last item in the array
a[-2:] # last two items in the array
a[:-2] # everything except the last two items
所以,在你的情况下,
a[::len(a)-1]
将数组从开始到结束以len(a)-1 = 4
的步长切片,即[1,5](跳过三个项目并保留第四个项目)
a[::-1]
反转数组。
答案 3 :(得分:0)
当您提供否定step
时,开始和停止的默认值(粗略地)切换:它将在列表末尾开始,并且停止一开始。我粗略地说&#39;因为,正如您所见,它经过调整,以便a[::-1]
仍然包含a
的所有元素 - 这意味着它实际上等同于a[-1:-len(a):-1]
。造成这种情况的原因可能与语法有多尴尬有关,与将序列与其比较的有用程度相比,它意味着a[0:-1:-1]
为空。
对于支持此语法的所有内置函数(列表,元组和字符串)都是如此,但对于支持它的第三方模块的任何类型,必然为真(这取决于各个类)什么切片意味着他们)。