Python切片运算符:负起始索引搭配正终止索引的疑问
Python负起始索引+正终止索引切片的困惑解析
嘿,这个问题我刚啃Python切片的时候也踩过坑!先给你掰明白核心逻辑,你就懂为啥结果和你预期不一样了。
首先,得先把Python切片的三个底层规则刻进脑子里:
- 左闭右开:切片
[start:end]会包含start索引对应的元素,但永远不包含end索引对应的元素。 - 默认步长为1:如果不写第三个参数,切片是从左往右(索引从小到大)遍历的。
- 索引的位置是固定的:正索引从左到右从0开始数,负索引从右到左从-1开始数,每个元素的位置是唯一的。比如拿列表
lst = [1,2,3,4,5]举例:- 1的位置:0 / -5
- 2的位置:1 / -4
- 3的位置:2 / -3
- 4的位置:3 / -2
- 5的位置:4 / -1
现在看你说的「负起始索引+正终止索引」的场景,比如你写了lst[-1:1](假设你的列表是上面这个):
- 起始索引
-1对应元素5,它的位置是4(正索引); - 终止索引
1对应元素2,位置是1; - 步长默认是1,也就是要从左往右(索引从小到大)取元素,但5的位置(4)比2的位置(1)大太多了——相当于你要从右边的点往左边走,但默认方向是往右,根本走不到,所以结果是空列表
[],自然不是你想的[5,4,3,2]或者类似的内容。
那如果想实现你说的「取最后一个元素到第二个元素的所有内容」该咋写?很简单,把步长改成-1(让切片从右往左遍历),比如lst[-1:0:-1]:
- 步长-1意味着从
start(-1,元素5)开始,往索引更小的方向走; - 终止索引是0,左闭右开,所以会停在索引1的位置(不包含索引0的元素1),最终得到
[5,4,3,2]。
如果你的预期是[5,1],那大概率是对切片的终止索引或者步长逻辑理解错了——比如你可能以为终止索引是「取到这个元素为止」,但实际上是「不包含这个元素」,而且方向不对的话连元素都取不到。
内容的提问来源于stack exchange,提问作者Tim Wißmann
相关产品推荐
相关产品推荐

