You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:19:08