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