Python切片和消极步幅 - 为什么这些例子显然是矛盾的?

时间:2013-10-23 13:21:31

标签: python slice

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

 +---+---+---+---+
 | 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也包含在返回的字符串中?

2 个答案:

答案 0 :(得分:4)

因此,您拥有的心理模型仅对步幅值有用,但在使用负步幅时无效。请改用以下图片:

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

您标记索引,边界。

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

有关细节的详细信息,请查看官方文档,了解Python计算切片的方式;来自sequence type notes(注5):

  

s[i:j:k]
  从步骤s ij的{​​{1}}切片被定义为索引k的项目序列,x = i + n*k。换句话说,索引是0 <= n < (j-i)/kii+ki+2*k等等,在达到i+3*k时停止(但从不包括{{1} }})。如果jj大于i,请使用j。如果省略len(s)len(s)i,则它们会变为“结束”值(结束取决于j的符号)。请注意,None不能为零。如果kk,则会将其视为k

因此,对于你的消极步伐,价值变为:

None

其中1是'end',这里是-1,因为那是你在负面步骤中用完字符串的点。然后指数成为:

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

给你3个指数。

答案 1 :(得分:1)

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