0

x = (1, 2, 3, 4)

在这里,x[0:4:-1]给出一个空的tuple (). 为什么会这样?我以为它只会给出一个反转的元组(4,3,2,1)......

4

2 回答 2

3

您要求所有值从 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 下:

sfrom ito jwith step的切片k被定义为具有索引的项目序列,x = i + n*k使得0 <= n < (j-i)/k. 换句话说,索引是ii+k、等i+2*k,在达到i+3*k时停止j(但从不包括j)。如果ij大于len(s),请使用len(s)。如果iorj被省略 or None,它们将成为“结束”值(结束取决于 的符号k)。注意,k不能为零。如果kNone,则视为一样1

于 2013-10-23T22:16:36.753 回答
3

您需要省略开始和结束,或者颠倒开始和结束:

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 切片语法不仅仅适用于元组;字符串和列表支持完全相同的语法。

于 2013-10-23T22:16:54.200 回答