Slicing
- 负数为
start
and stop
意思是“从最后”。它本质上相当于len-value
.
- 负数为
step
意思是“相反的顺序”。
- 空开始意味着 0,即第一个元素。
- 空停意味着
len
。停止参数是唯一的!
So [::-1]
表示从第一个元素到最后一个元素,以 1 为步长,逆序排列。
- 如果你有
[start:stop]
它是一样的step=1
. So [:-1]
这意味着除了最后之外的一切。又是最后一个元素独家的。它是一样的[:-1:]
or [0:-1:1]
.
如果你只有start
,它返回一个由索引给出的元素start
. Thus [-1]
表示最后一个元素。与...一样[len-1]
would.
range
范围也有语法start,stop,step
但该步骤具有不同的含义。步骤从以下位置开始重复添加start
。所以你开始于4
,然后向下添加-1
直到你击中stop
,也独占。所以range(5,0)[::-1]
相当于range(4,-1,-1)
。你可以计算一下。
为什么口译员说range(0,5)[::-1] => range(4, -1, -1)
?
Python解释器足够聪明,可以将一部分转换为range
进入另一个range
。这是一种优化,范围是生成器。它们是动态的,即它们不会同时保存内存中的所有元素。如果您使用的解释器逐步工作,它必须生成整个列表,只是为了能够以相反的顺序迭代。计算新的生成器更加智能。
Łukasz 的回答详细解释了它是如何完成的。
顺便提一句。你可以强制它生成一个list
,并阻止优化:
range(0,5)[::-1]
=> range(4, -1, -1)
list(range(0,5))[::-1]
=> [4, 3, 2, 1, 0]