如何用slice.indices处理切片中缺失的start和end参数?
Python切片缺省参数与slice.indices()的用法
1. 缺省start/end时怎么创建slice对象
写seq[::-1]这种省略起始、结束位置的切片时,对应的slice对象要用None替代缺失的参数,也就是slice(None, None, -1)。同理,seq[2:]对应slice(2, None, None),seq[:5]对应slice(None,5,None)。
2. 为啥seq[5:-1:-1]返回空,seq[::-1]却能反转
核心区别在显式写-1当end和slice.indices()返回的-1不是一回事:
- 直接写
seq[5:-1:-1]时,Python会先把负索引-1转换成正索引len(seq)-1=5,实际就变成了seq[5:5:-1]——起始和结束位置相同,自然拿不到任何元素。 - 而
slice(None, None, -1).indices(6)返回的-1是个特殊的终止边界:当step为负时,迭代从start(这里是5)开始往索引减小的方向走,直到索引小于这个end值才停止。range(5, -1, -1)会生成5,4,3,2,1,0,刚好覆盖所有字符,所以能反转整个字符串。
3. 用slice.indices()获取缺省参数的实际值
不管切片参数有没有省略,只需要两步就能拿到实际生效的(start, end, step):
- 把切片转换成slice对象:缺省的位置用
None补上,比如seq[a:b:c]对应slice(a,b,c),seq[::-1]对应slice(None, None, -1)。 - 给slice对象的
indices()方法传入序列的长度len(seq),它会返回调整后的三元组,这个三元组直接扔进range()就能生成切片用到的所有索引。
举几个实际例子(以seq='python',长度6为例):
# 对应seq[::-1] s1 = slice(None, None, -1) print(s1.indices(6)) # 输出 (5, -1, -1) # 生成索引:range(5, -1, -1) → 5,4,3,2,1,0 # 对应seq[2:] s2 = slice(2, None, None) print(s2.indices(6)) # 输出 (2, 6, 1) # 生成索引:range(2,6,1) →2,3,4,5 # 对应seq[:3:-1] s3 = slice(None, 3, -1) print(s3.indices(6)) # 输出 (5, 3, -1) # 生成索引:range(5,3,-1) →5,4
内容的提问来源于stack exchange,提问作者Invictus
相关产品推荐
相关产品推荐

