Python代码调试求助:解决列表索引越界(IndexError: list index out of range)问题
调试"IndexError: list index out of range"问题
嘿,我明白你遇到的麻烦了——明明看着i在初始的索引范围内,却还是触发了索引越界错误,这确实挺让人困惑的。咱们来拆解一下问题出在哪:
问题根源
你在循环里用了range(length),这里的length是初始列表的长度(7),但每次执行list.pop(i)时,原列表的长度都会减少1。举个具体的例子:
- 当
i=3时,你pop了索引3的元素(第一个0),原列表变成[1,2,4,0,7,5],长度变成6 - 后续循环继续按初始的
range(7)走,当i走到6的时候,原列表的实际长度已经小于7了,这时候访问list[6]自然就会超出范围。
而且还有个隐形问题:你pop(i)之后立刻new_list.append(list[i]),这时候list[i]已经是原来索引i+1的元素了——因为pop操作会让后面的元素往前挪一位,这根本不是你想要提取的那个元素。
修复方案
这里有几种靠谱的解决办法,你可以选适合你的:
方法1:遍历原列表的副本(保留修改原列表的操作)
original_list = [1, 2, 4, 0, 0, 7, 5] new_list = [] # 遍历原列表的副本,原列表的修改不会影响循环次数 for num in original_list.copy(): if num == 0 or num == 7: original_list.remove(num) new_list.append(num) print(new_list)
方法2:用列表推导式(最简洁,推荐)
如果不需要修改原列表,只是要把符合条件的元素提取到new_list,直接用列表推导式一步到位:
original_list = [1, 2, 4, 0, 0, 7, 5] new_list = [num for num in original_list if num == 0 or num == 7] print(new_list)
输出结果是[0,0,7],完全符合你的需求。
方法3:反向遍历原列表(必须修改原列表时用)
如果一定要在遍历过程中修改原列表,反向遍历可以避免索引错位——从后往前pop,不会影响前面未遍历元素的索引:
original_list = [1, 2, 4, 0, 0, 7, 5] new_list = [] # 从最后一个索引开始往前遍历 for i in range(len(original_list)-1, -1, -1): if original_list[i] == 0 or original_list[i] == 7: new_list.append(original_list.pop(i)) # 反向pop会让new_list顺序反转,需要调整回来 new_list.reverse() print(new_list)
小提醒
尽量不要用list作为变量名哦,它是Python的内置类型,这样命名会覆盖掉内置的list()函数,可能会引发其他奇怪的问题。
内容的提问来源于stack exchange,提问作者Gnaneshwaar
相关产品推荐
相关产品推荐

