Python字符串切片索引疑问:number[-3:1:-3]为何输出5而非52?
Python负数步长切片的逻辑解析
嘿,这个问题刚好戳中了Python切片里容易混淆的点——负数步长的停止规则和正数步长是反过来的,我给你一步步拆解清楚:
首先先明确字符串number = "1234567"的索引对应关系,方便我们对照:
- 正索引:
0: '1',1: '2',2: '3',3: '4',4: '5',5: '6',6: '7' - 负索引:
-7: '1',-6: '2',-5: '3',-4: '4',-3: '5',-2: '6',-1: '7'
接下来看你的切片number[-3:1:-3],我们拆分三个参数:
- start = -3:对应正索引4,也就是字符
'5',切片会从这个位置开始取元素 - end = 1:对应正索引1,也就是字符
'2',这是切片的停止边界 - step = -3:表示遍历方向是从右往左,每次跳过2个元素(步长绝对值是3,所以每次移动3个位置)
现在关键来了:当步长为负数时,切片会持续取元素,直到当前位置到达或者越过end位置时停止,而且end位置的元素永远不会被包含。
我们模拟遍历过程:
- 第一步:取start位置的
'5'(正索引4),加入结果 - 第二步:往左移动3个位置,计算新的索引:
4 - 3 = 1,这个位置正好是end指定的索引1。这时候触发停止条件(当前位置等于end),所以这个位置的'2'不会被加入结果
这就是为什么最终输出只有'5',而不是'52'。
如果想要包含'2',你需要把end设置为比1更小的数值,比如number[-3:-6:-3]或者number[-3:0:-3],这样遍历到索引1的时候还没到达end,就会把'2'也包含进去,输出就是'52'啦。
内容的提问来源于stack exchange,提问作者Francis Yvan Navarrosa
相关产品推荐
相关产品推荐

