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
相关产品推荐
相关产品推荐

