因此,您拥有的心智模型仅对正步幅值有用,但在使用负步幅时无济于事。请改用下图:
+---+---+---+---+
| T | e | s | t |
+---+---+---+---+
0 1 2 3 4
-5 -4 -3 -2 -1
在哪里标记索引,而不是边界。
边界模型很好,但只是为了更容易忘记结束索引不包含在结果值中的事实。通过仅对索引进行编号并省略结束索引,您可以看到正跨步和负跨步是如何工作的。
有关详细信息,请查看官方文档以了解 Python 计算切片的方式;来自序列类型注释(注释 5):
s[i:j:k]
s
from i
to j
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
被省略 or None
,它们将成为“结束”值(结束取决于 的符号k
)。注意,k
不能为零。如果k
是None
,则视为一样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个指数。