负步长的扩展切片语法实际做了什么?
在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 个回答
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'