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 下:
sfromitojwith 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)。如果iorj被省略 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 切片语法不仅仅适用于元组;字符串和列表支持完全相同的语法。