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

Python代码正常运行报IndexError,调试时无异常求助

问题根源与修复方案

问题原因

你的代码触发IndexError的核心原因是:next_operations是按jobs列表的长度初始化的数组,但job的值是原始序列中的编号——当job的数值大于等于next_operations的长度时,就会出现索引越界。

举个实际例子:如果你的sequence是[1,2,3],jobs列表会被填充为[1,2,3],len(jobs)=3,因此next_operations是长度为3的数组(索引范围0-2)。当遍历到job=3时,访问next_operations[3]自然会超出数组索引范围,触发报错。

调试时程序正常,是因为你用的测试数据(比如[0,1,0,2,1,2,2])中,job编号刚好是从0开始的连续整数,next_operations的索引范围刚好能覆盖所有job值,所以不会触发错误。但实际运行的sequence中存在不连续或数值过大的job编号,就会暴露问题。

修复方案

方案1:使用字典存储(推荐)

字典可以灵活处理任意数值的job编号,不会出现索引越界问题,且内存利用更高效:

next_operations = {}
for job in sequence:
    # 初始化job的操作计数(如果不存在)
    if job not in next_operations:
        next_operations[job] = 0
    operation = next_operations[job]
    next_operations[job] += 1

如果导入collections模块,代码可以更简洁:

from collections import defaultdict

next_operations = defaultdict(int)
for job in sequence:
    operation = next_operations[job]
    next_operations[job] += 1

方案2:基于最大job编号初始化数组

如果确定job编号都是整数,且可以接受数组占用的内存空间,可以先找到最大的job编号,再初始化足够长的数组:

max_job = max(sequence)
next_operations = [0] * (max_job + 1)

for job in sequence:
    operation = next_operations[job]
    next_operations[job] += 1

注意:如果job编号数值很大(比如10000),这种方法会创建一个超长数组,造成内存浪费,因此更推荐字典方案。

内容的提问来源于stack exchange,提问作者dhutter92

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:22:16