Python 的逆序 slice 切片2017年12月28日
@[toc]
Python 的切片相信大家已经很熟悉了,语法是这样的 a[[start]:[end][:[step]]],其中索引为 end 的元素不会被包括进来。start、end、step 和 step 前面的冒号 都可以省略。这么多可以省略的,那么解释器是怎么设置默认值的呢?很有趣,解释器对正序和逆序切片的默认值设置是不一样的,我们在实战中看结果吧。
全文用到的变量 a 长这样:
1 | a="0123456789" |
正序切片
在正序切片中,默认值的设置为
- start =
0 - end =
-1 后面一位,即切片会返回包括 str 最后一个元素 - step =
1
其中 end 的默认值为 -1 后面一位 是什么意思呢?这里的 -1 指的是 index 为 -1 的元素,即 str 的最后一个位置,在 a 中指的是 9 这个元素。那它后面一位是无意义的,但解释器执行的时候会切片到该元素的前一位,即 9。
下面是几种正序切片的常见用例
1 | a[:] |
注意这里切片返回的结果不会包括索引为 -1 的元素
1 | a[:-1] |
1 | a[:8] |
逆序切片 (step 为负数)
逆序切片的默认值就很有意思了,不注意的话非常容易混淆搞错边界索引,它的默认值是
- start =
-1 - end =
0 前面一位,即切片会返回包括str第一个元素
这里的逻辑是,从 start 元素开始,在其索引上依次加上 step,找到下一个索引直到 end,所以写逆序切片的时候,start 的索引是大于 end 的索引的。
1 | a |
总结
其实不难反推出来,默认的值并不是写死的,而是根据 step 值来从 start 或者 end 二者之一来用加上 step 依次推导,直到队列最前 / 最后一个元素的。如果不熟悉的话,逆序切片很容易在边界上出错,也不直观,不易理解,最好使用其他等效的操作来替代。