深入理解Python切片
Python中序列的切片虽然基础但也很重要,最近看到一个[::-1]的切片表达式,不明所以,博主查了一些资料并做了实际操作,对Python切片有了更深刻的认识,以下结合例子详细说明。
首先看下切片的基本语法。一般认为切片的语法是[N:M],它是一个半闭合区间,等效于数学上[N,M)取值范围,即取N不取M。另外,N和M都可以省略,并且需满足N<M,否则取不到值。
现在回头看上面的切片表达式[::-1],双冒号好理解,[::]代表取整个序列,后面又带个-1是什么鬼?
查资料,重新审视切片的语法,博主发现,完整的切片语法是[N:M:S],其中的S代表step,嗯,有点线索了。
先看下面的例子,通过控制step可以更灵活的取数据,wonderful!
>>> s
[1, 2, 3, 4, 5, 6, 7, 8]
>>> s[::]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> s[::1]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> s[::2]
[1, 3, 5, 7]
那么step = -1是什么意思?[::-1]实操的结果如何,又如何解释?
>>> s[::-1]
[8, 7, 6, 5, 4, 3, 2, 1]
上述结果表明,s[::-1]返回一个逆序的列表.
博主通过查询得知,s可以为负数,并且s的正负对切片的行为有重要影响,具体来说有2个方面影响:
1. 影响N,M的缺省值
2. 影响切片取值方向
s缺省为1,如果s>0,则切片从左向右取,缺省N=0,M=len(s)
>>> s[0:len(s)]
[1, 2, 3, 4, 5, 6, 7, 8]
因为是从左往右取,所以要求N<M,否则取不到,这个规则同样适用于N,M为负数的情况。
看下面的例子,第一个N=-1,M=-2,N>M,从左往右取,-2位置上在-1的左边,所以取不到,第二个N=-2,M=-1,从-2向右-1取,得7,符合上述规则!
>>> s[-1:-2]
[]
>>> s[-2:-1]
[7]
如果s<0,会如何?
缺省值:N= -1,M = -len(s)-1
方向:从右向左取
这就解释了[::-1]的结果,[::]代表取全序列,-1代表从右向左取步长为1
>>> s[::-1]
[8, 7, 6, 5, 4, 3, 2, 1]
#等效于
>>> s[-1:-len(s)-1:-1]
[8, 7, 6, 5, 4, 3, 2, 1]
理解了以上原则,就不难理解以下切片的结果了。
可以看到此时,例1,N>M,但可以取到值,例2,N<M取不到值,原因是s=-1,从右向左取值的缘故
>>> s[-1:-2:-1]
[8]
>>> s[-2:-1:-1]
[]
总之,s的正负会影响切片取值方向,使用中需要特别注意。
补充:
上述结论也可以解释以下切片结果:
>>> s="Hello World"
>>> s[-5:0]
''
# n=-5,m=0,s=1, 满足n<m,但n,m符号不一致,从n开始,从左向右取,所以取不到.
>>> s[-5:-1]
'Worl'
#n=-5,m=-1,s=1, 满足n<m,n,m同号,从n开始,从左向右取
>>> s[-5:1]
''
#同case1
>>> s[-5:0:-1]
'W olle'
>>> s[-5:1:-1]
'W oll'
>>>