为何使用正起始、负终止及步长-1的切片会得到空字符串?
Python切片负步长的逻辑解析
你遇到的问题核心在于Python切片中负步长时的终止索引判断规则,和你对负索引的理解有偏差。
先明确字符串test的索引对应:
- 正索引:
t(0)、e(1)、s(2)、t(3) - 负索引:
t(-1)、s(-2)、e(-3)、t(-4)
1. 为什么test[3:-1:-1]返回空字符串?
Python切片的语法是[start:stop:step],当step为负时,切片规则是:
- 从
start指定的索引位置向索引减小的方向(从右往左)遍历 - 当遍历到等于或越过
stop索引时停止,且stop对应的元素不会被包含
在test[3:-1:-1]中:
start=3:对应字符t(最后一个字符)stop=-1:对应索引也是3(因为负索引-1指向最后一个元素)step=-1:要求从右往左走
此时起始位置和终止位置的索引都是3,相当于刚出发就已经到达了不包含的终止点,自然没有元素可以取,所以返回空字符串。
2. test[3::-1]为什么能得到正确结果?
当切片中省略stop参数时,Python会根据step的正负自动设置默认终止位置:
- 若
step为负,默认stop会被视为比字符串最小索引(0)更小的位置(可以理解为遍历到字符串开头为止) - 所以
test[3::-1]会从索引3开始,一直向左遍历到索引0(包含0),最终得到字符序列test[3]、test[2]、test[1]、test[0],即结果"tset"。
总结
负步长切片的关键是:起始索引必须在终止索引的“右侧”(索引值更大),否则切片结果为空。test[3:-1:-1]中起始和终止索引相同,不满足“右侧”的条件,所以返回空;而test[3::-1]的终止索引被默认设为极小值,满足条件,因此能正常逆序截取。
内容的提问来源于stack exchange,提问作者kiran kumar
相关产品推荐
相关产品推荐

