4

我在这里阅读了一堆关于将切片与负步幅相结合的答案,但以下问题仍然让我感到困惑。在几个地方,我看到下图用于说明切片符号的工作原理(指的是间隙,而不是条目):

 +---+---+---+---+
 | T | e | s | t |
 +---+---+---+---+
 0   1   2   3   4
-4  -3  -2  -1  

这些例子与上图一致:

>>> "Test"[2:]
'st'

>>> "Test"[-2:]
'st'

>>> "Test"[-2::-1]
'seT'

似乎不一致 - 如果从-2分隔符开始并向后计数,为什么s返回的字符串中也包含 ?

4

2 回答 2

5

因此,您拥有的心智模型仅对正步幅值有用但在使用负步幅时无济于事。请改用下图:

  +---+---+---+---+
  | T | e | s | t |
  +---+---+---+---+
    0   1   2   3   4
-5 -4  -3  -2  -1  

在哪里标记索引,而不是边界。

边界模型很好,但只是为了更容易忘记结束索引不包含在结果值中的事实。通过仅对索引进行编号并省略结束索引,您可以看到正跨步和负跨步是如何工作的。

有关详细信息,请查看官方文档以了解 Python 计算切片的方式;来自序列类型注释(注释 5):

s[i:j:k]
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

因此,对于您的负步幅,这些值变为:

i = len(s) - 2 = 2 
j = None = -1 (end for negative strides, *not* len(s) - 1)
k = -1

“结束”在哪里j,这里是-1,因为那是您在负步骤中用完字符串的点。然后索引变为:

x0 = i + 0*k = 2
x1 = i + 1*k = 1
x2 = i + 2*k = 0

给你3个指数。

于 2013-10-23T13:35:02.800 回答
1

如果"Test"[-2:]包含s,那么按照相同的逻辑,它会包含sin "Test"[-2::-1],因为范围包括第一个位置但不包括第二个位置。

于 2013-10-23T13:34:25.027 回答