关于python:扩展切片语法实际上对负步骤做了什么?

What does extended slice syntax actually do for negative steps?

本问题已经有最佳答案,请猛点这里访问。

python中的扩展片语法被解释为"a[n:m:k] returns every kth element from n to m"。

这给了我一个很好的主意,当k为正数时,会发生什么。但是,我对如何解释负k的a[n:m:k]迷路了,我知道a[::-1]反转a,a[::-k]取反a的kth元素。

但这是如何推广k正的定义呢?我想知道a[n:m:k]是如何定义的,以便(例如)我能理解为什么:

1
"abcd"[-1:0:-1] ="dcb"

a[n:m:-k]是否颠倒了序列a,然后从n开始,到m之前结束的元素取原始索引?我不这么认为,因为这个模式不适合我尝试过的N和M的其他值。但我不知道这到底是怎么定义的,搜索并没有给我任何帮助。


[-1:0:-1]是指:从指数len(string)-1开始,向上移动到0(不包括在内),再向上移动一步-1(反向)。

因此,将获取以下索引:

1
le-1, le-1-1, le-1-1-1  .... 1  # le is len(string)

例子:

1
2
3
4
5
6
7
8
9
10
In [24]: strs = 'foobar'

In [25]: le = len(strs)

In [26]: strs[-1:0:-1]  # the first -1 is equivalent to len(strs)-1

Out[26]: 'raboo'

In [27]: strs[le-1:0:-1]  
Out[27]: 'raboo'


python文档(这里是技术文档;对range()的解释比简化的"every kth元素"解释更为正确。切片参数的名称恰当

1
slice[start:stop:step]

因此,切片从start定义的位置开始,在到达位置stop之前停止,并通过step项从一个位置移动到下一个位置。