Python 作业报错“list index out of range”怎么调试
Python 作业报错“list index out of range”怎么调试
学弟/学妹你好,这个报错可以说是 Python 新手最容易踩的坑之一,几乎每个学 Python 的人都会遇到。别慌,我当年也被它折磨过好几回,后来总结了一套“三步排查法”,基本能解决 90% 的情况。
先给排查思路(按顺序来)
1.看报错行号,定位具体是哪一行代码报错
Python 的报错信息会告诉你IndexError: list index out of range发生在第几行。先找到那行代码,看里面哪个地方用了[]来取下标。
2.检查列表的长度和你要取的下标值
假设列表叫my_list,你要取my_list[i],那i必须在0到len(my_list)-1之间。如果i等于len(my_list)或者更大,就会报错。
3.打印调试信息
在报错行之前加一句print(len(my_list), i),看看列表长度和下标分别是多少。很多时候你会发现列表比想象中短,或者循环里的下标跑超了。
4.检查循环逻辑
常见场景:用for i in range(len(my_list))时,循环体内又对my_list做了pop()或remove(),导致列表变短但循环次数没变,下标就超了。
5.检查输入数据
有时候列表是从文件或用户输入读进来的,可能数据不符合预期(比如空行、少了一列)。最好先print(my_list)看看实际内容。
可运行示例代码(Python)
下面是一个典型的踩坑场景和修复方法,你可以直接跑一下感受:
# 场景:从文件读取学生成绩,计算平均分 # 假设文件内容格式:姓名,成绩1,成绩2,成绩3 # 示例文件内容(保存为 students.txt): # 张三,80,90,85 # 李四,70,75 # 王五,90,95,88 def read_scores(filename): """读取文件,返回每个学生的平均分列表""" averages = [] with open(filename, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: # 去掉换行符,按逗号分割 parts = line.strip().split(',') # 姓名是第一个元素,成绩从索引1开始 name = parts[0] # 坑:如果某行只有姓名没有成绩,parts[1] 就会报 index out of range # 下面这行会报错:IndexError: list index out of range scores = [int(parts[1]), int(parts[2]), int(parts[3])] avg = sum(scores) / len(scores) averages.append((name, avg)) return averages # 修复版本 def read_scores_fixed(filename): averages = [] with open(filename, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: parts = line.strip().split(',') if len(parts) < 2: # 没有成绩,跳过 continue name = parts[0] # 把剩下的部分当作成绩,不管有几个 scores_str = parts[1:] # 转换成整数,跳过无法转换的 scores = [] for s in scores_str: try: scores.append(int(s)) except ValueError: print(f"警告:{name} 的成绩 '{s}' 不是数字,已跳过") if scores: # 至少有1个成绩才计算 avg = sum(scores) / len(scores) averages.append((name, avg)) else: print(f"警告:{name} 没有有效成绩") return averages # 测试 if __name__ == "__main__": # 先运行会报错的版本(如果文件存在的话) # 注意:这里故意注释掉,避免直接报错 # result = read_scores("students.txt") # 运行修复版本 result = read_scores_fixed("students.txt") for name, avg in result: print(f"{name} 的平均分:{avg:.2f}")运行这段代码前,记得在同目录下创建一个students.txt文件,内容可以复制注释里的示例。
核心要点总结
-下标从 0 开始,list[0]是第一个元素,list[len(list)-1]是最后一个。
-永远先检查长度,再取下标。
-循环里不要动态修改列表,如果非要改,用while循环或者创建一个新列表。
-处理不确定的数据(文件、用户输入)时,一定要做长度校验。
如果按上面步骤仍报错,把完整报错栈和对应代码贴到评论区,我可以帮你一起看是下标算错还是列表被意外改短了。