x = (1, 2, 3, 4)
在这里,x[0:4:-1]
给出一个空的tuple
()
. 为什么会这样?我以为它只会给出一个反转的元组(4,3,2,1)
......
您要求所有值从 0 开始,在 4 之前结束,一次计数 -1。那是没有价值的。
你想要做的是从 3 开始,在 -1 之前结束,一次计数 -1。除了……你不能放在-1
那里,因为那意味着“从头到尾 1”。所以,你必须写“从 3 开始,当你用尽整个序列时结束,一次计数 -1”,如下所示:
x[3::-1]
或者,更简单地说:
x[::-1]
将切片转换为显式循环可能有助于您理解。它看起来像这样:
def slicify(sequence, start, end, step):
if start < 0: start += len(sequence)
if end < 0: end += len(sequence)
result = []
while (start < end if step > 0 else start > end):
result.append(sequence[start])
start += step
return result
但这只是大致正确的。确切的定义在Sequence Types下的文档中,注释 5 下:
s
fromi
toj
with step的切片k
被定义为具有索引的项目序列,x = i + n*k
使得0 <= n < (j-i)/k
. 换句话说,索引是i
、i+k
、等i+2*k
,在达到i+3*k
时停止j
(但从不包括j
)。如果i
或j
大于len(s)
,请使用len(s)
。如果i
orj
被省略 orNone
,它们将成为“结束”值(结束取决于 的符号k
)。注意,k
不能为零。如果k
是None
,则视为一样1
。
您需要省略开始和结束,或者颠倒开始和结束:
x[::-1] # (4, 3, 2, 1)
x[3:0:-1] # (4, 3, 2)
x[3::-1] # (4, 3, 2, 1)
x[3:-5:-1] # (4, 3, 2, 1)
端点不包括在内,因此切片[3:0:-1]
仅返回三个元素。最后一个示例使用从元组的长度中减去负值以结束端点-1
。
使用负步幅意味着 Python 想要倒数,从 0 开始你永远不会到 4。
请注意,Python 切片语法不仅仅适用于元组;字符串和列表支持完全相同的语法。