zz:http://blog.csdn.net/hengyunabc/article/details/6540157
seq[start:stop:step]
start:同其它语言一样,从0开始。序列从左向右方向中,第一个值的索引为0,最后一个为-1
stop:切片操作符将取到该索引为止,注意:不包含该索引的值。
step:默认是一个接着一个切取,如果为2,则表示进行隔一取一操作。步长值为正时表示从左向右取,如果为负,则表示从右向左取。步长值不能为0
list的切片,内部是调用__getitem__,和slice函数。而slice函数又是和range()函数相关的。
range([start], stop[, step])
[start, start + step, start + 2 * step, ...]
真正让人迷惑的是list[start:stop:step]中的start和stop的默认值。
按《Python参考手册(第4版)》的说法:
如果不指定start和stop具体值
当step>0时,start和stop默认值是索引的开头
当step<0时,start和stop默认值是索引的结尾
我仔细再想下,发现有点不妥,a[::-1]又怎样解释?
我觉得step的符号表示一种方向的含义:
+:即从左向右看,所以start默认是0,stop默认是索引最大值
- :即从右向左看,所以start默认是索引最大值,stop默认是0
若,start->stop 顺序和+(-)的方向相反,则为空
如:
a = [0,1,2,3,4,5,6,7,8,9]
a[:5:-1] #step < 0,所以start = 9
a[0:5:-1] #指定了start = 0
a[1::-1] #step < 0,所以stop = 0
Python3代码:
l = list(range(10))
print(l[5:0:-1])
print(l[5:4:-1])
print(l[:3:-1])
print(l[0:3:-1])
print(l[9::-1])
输出:
[5, 4, 3, 2, 1]
[5]
[9, 8, 7, 6, 5, 4]
[]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
转载于:https://blog.51cto.com/zhanboom/923911