Python序列负数索引切片的思考

2018-08-21  本文已影响366人  马小李23

Python中的序列是可以采用负数的索引来访问的,其范围是 -1 到序列的负长度,也就是
-len(sequence) <= index <= -1,负索引以序列的结束为起点。除了提供按照索引,访问序列中的单个元素,Python也提供了切片的方式访问序列中的子序列的方式,这就是切片的访问方式,其一般语法如下:
sequence[starting_index:ending_index]
如此,我们会得到从starting_index对应元素开始,到ending_index对应元素结束,但是不包括ending_index对应元素,所组成的子序列的内容。起止索引都是可选的选项,如果没有提供或者为None,那么开始索引默认为0,结束索引默认为序列最末尾的索引。切片的访问模式,有第三个值,类似于步长,其访问类似下面代码

>>> ('a','b','c','d')[0:3:2]
('a', 'c')

在《Python核心编程(第二版)》一书中指出,切片的访问,开始和终止的索引,都可以超过序列的长度,然后给出了如下的代码示例:

>>> ('Faye', 'Leanna', 'Daylen')[-100:100]
('Faye', 'Leanna', 'Daylen')

这样有点难以理解,就是开始的序列是负数,然而访问的得到的序列还是正序的。其实对于这样的访问,首先要排除书中刚刚提到的步长的干扰,重新看切片两个参数情况下的访问说明是:得到从starting_index对应元素开始,到ending_index对应元素结束,但是不包括ending_index对应元素,所组成的子序列的内容。
那么再回到上述例子中来,-100是不存在的,那么从-100开始自增,最早存在的能访问其对应元素的索引是-3,也就是’Faye’,那么开始的索引就是这个。而从100递减,最早存在的能访问其对应元素的索引是3,就是’Daylen’,于是切片访问两者之间的组成的子序列,就是上述程序的输出。
如果还是不能明白,可以看几个简单的例子:

>>> ('a','b','c','d')[-4]
'a'
>>> ('a','b','c','d')[-4:4]
('a', 'b', 'c', 'd')
>>> ('a','b','c','d')[-4:0]
()
>>> ('a','b','c','d')[-4:1]
('a',)
>>> ('a','b','c','d')[-4:2]
('a', 'b')
上一篇下一篇

猜你喜欢

热点阅读