负步长的扩展切片语法实际做了什么?

29 投票
2 回答
19473 浏览
提问于 2025-04-17 13:37

在Python中,扩展切片的语法可以理解为“a[n:m:k] 从n到m每隔k取一个元素”。

这样我对k为正数的情况有了一个大概的了解。但是当k为负数时,我就搞不清楚该怎么理解a[n:m:k]了。我知道a[::-1]是把a反转,而a[::-k]则是从反转后的a中每隔k取一个元素。

但这怎么能算是对正数k定义的一个推广呢?我想知道a[n:m:k]到底是怎么定义的,这样我才能理解为什么:

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

那么a[n:m:-k]是不是先把序列a反转,然后再从n开始取元素,直到在m之前的一个元素呢?我觉得不是,因为这个模式和我尝试过的其他n和m的值不太符合。但我真的搞不清楚这到底是怎么定义的,搜索也没有找到答案。

2 个回答

14

Python的官方文档(这里是技术性的内容;而关于range()的解释稍微容易理解一些)比简单的“每隔k个元素”这种说法更准确。切片的参数命名得很贴切。

slice[start:stop:step]

所以,切片是从start指定的位置开始,到stop指定的位置之前结束,并且每次移动step个位置。

26

[-1:0:-1] 的意思是:从字符串的最后一个位置开始,向前移动到位置 0(不包括这个位置),每次移动一步是 -1(也就是反向移动)。

所以,下面这些位置会被取到:

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

举个例子:

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'

撰写回答