Cao Yi

Python 切片操作中 step 为负值如何理解?

Index

切片操作是Python中对序列对象(如字符串、列表等)进行切片的一种操作方式。它的基本语法是 [start:stop:step],其中 start 表示起始位置(默认为0),stop 表示结束位置(默认为序列的长度),step 表示步长(默认为1)。

在 Python 中,切片操作的 step 参数可以为负值,表示从右往左取值,即反向切片。

step 参数为正数时,切片从左往右取值,每次取值的步长为 step;当 step 参数为负数时,切片从右往左取值,每次取值的步长为 step 的绝对值。

需要注意的是,当 step 参数为负数时,切片的起始索引位置应该在终止索引位置的右侧。否则,切片将返回空序列。例如,”123456789”[3:1:-1] 表示从 “123456789”[3] 开始向左取值,直到 “123456789”[1] 为止(不包括 “123456789”[1]),每次取值的步长为 1。这里的起始索引位置 3 大于终止索引位置 1,但由于 step 参数为负数,所以切片仍然有效。最终返回的序列为 “123456789”[3] 和 “123456789”[2],即 43

>>> "123456789"[3:1:-1]
'43'

对于一个字符串 s,使用 “123456789”[::-1] 可以将字符串反转,这里的 step 参数为 -1,表示从右往左取值,每次取值的步长为 1。这里的 startstop 默认值和 step 为正数时相反,都不写,表示默认取整个字符串的范围。要覆盖整个字串时 stop 必须为空,因为在从左往右操作时,没有合适的值能表示第一个元素左边的索引。

>>> "123456789"[9:0:-1]  
'98765432'
>>> "123456789"[9::-1]  
'987654321'
>>> "123456789"[::-1]  
'987654321'

整个切片操作的从字符串的最后一个字符开始,以步长 -1 取字符,一直取到字符串的第一个字符为止,从而实现了字符串的反转。

其他步长的例子略举如下:

>>> "123456789"[::-2]   
'97531'
>>> "123456789"[::-3] 
'963'
>>> "123456789"[::-4] 
'951'
>>> "123456789"[::-5] 
'94'
>>> "123456789"[::-6] 
'93'
>>> "123456789"[::-7] 
'92'
>>> "123456789"[::-8] 
'91'
>>> "123456789"[::-9] 
'9'
>>> "123456789"[::-10] 
'9'
>>> "123456789"[::-11] 
'9'