Python
的切片相信大家已经很熟悉了,语法是这样的
a[[start]:[end][:[step]]]
其中索引为 end
的元素不会被包括进来。start
、end
、step
和 step 前面的冒号
都可以省略。这么多可以省略的,那么解释器是怎么设置默认值的呢?很有趣,解释器对正序和逆序切片的默认值设置是不一样的,我们在实战中看结果吧。
全文用到的变量 a
长这样:
a="0123456789"
在正序切片中,默认值的设置为
0
-1 后面一位
,即切片会返回包括 str 最后一个元素1
其中 end
的默认值为 -1 后面一位
是什么意思呢?这里的 -1
指的是 index
为 -1
的元素,即 str
的最后一个位置,在 a
中指的是 9
这个元素。那它后面一位是无意义的,但解释器执行的时候会切片到该元素的前一位,即 9
。
下面是几种正序切片的常见用例
a[:]
a[0:]
a[::]
a[::1]
a[0::1]
>>> '0123456789'
注意这里切片返回的结果不会包括索引为 -1 的元素
a[:-1]
>>> '012345678'
a[:8]
>>> '01234567'
a[8:]
>>> '89'
a[:8:2]
a[0:8:2]
>>> '0246'
逆序切片的默认值就很有意思了,不注意的话非常容易混淆搞错边界索引,它的默认值是
-1
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
依次推导,直到队列最前 /最后一个元素的。如果不熟悉的话,逆序切片很容易在边界上出错,也不直观,不易理解,最好使用其他等效的操作来替代。
更多内容可以关注我的博客,主要分享生活、工作、读书中的一些心得感悟 http://blog.filosfino.com/
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.