编程调试14 分钟阅读
Python 常见错误与调试技巧:留学生编程作业完全指南
10 类最常见 Python 报错——每种附触发原因、错误示例 vs 正确写法、修复建议,帮你在 deadline 前快速定位问题
报错不知道怎么看?
把报错信息粘贴到我们的工具,自动识别错误类型并给出修复建议
为什么 Python 报错这么难看懂?
Python 的报错信息(Traceback)从下往上读:最后一行是错误类型和原因,往上是调用链。 很多同学看到一堆红字就慌了,其实只需要关注最后 2–3 行即可定位问题。
# 读懂 Traceback 的方法
Traceback (most recent call last):
File "main.py", line 12, in calculate # ← 出错的函数
result = x + name # ← 出错的那行代码
TypeError: unsupported operand type(s) for +: 'int' and 'str' # ← 从这里开始读!
10 类常见 Python 错误详解
01
SyntaxError
代码不符合 Python 语法规则
# 错误示例
def greet(name) # 缺少冒号
print("Hello", name)
# 正确写法
def greet(name):
print("Hello", name)
修复方法
- →检查每个 def / if / for / while / class 语句末尾是否有冒号
- →确认括号、引号、方括号是否成对
- →缩进必须一致(推荐用 4 个空格,不要混用 Tab)
- →从第一个报错行开始修,后续错误可能是连锁反应
02
IndentationError
缩进不一致或缩进层级错误
# 错误示例
def calculate(x):
result = x * 2
return result # 缩进少了
# 正确写法
def calculate(x):
result = x * 2
return result
修复方法
- →全文统一使用 4 个空格缩进(IDE 可设置 Tab 自动转空格)
- →不要在同一代码块中混用 Tab 和空格
- →VS Code 右下角可查看当前文件的缩进类型
03
NameError
使用了未定义的变量名或函数名
# 错误示例
print(total) # total 还没定义
# 正确写法
total = 0
for i in range(10):
total += i
print(total)
修复方法
- →检查变量名拼写(Python 区分大小写,total ≠ Total)
- →确认变量在使用前已赋值
- →函数调用时确认函数定义在调用之前
- →注意作用域:函数内部的变量在函数外不可见
04
TypeError
对错误类型的对象执行了不支持的操作
# 错误示例
age = "20"
print(age + 5) # str 不能直接加 int
# 正确写法
age = "20"
print(int(age) + 5) # 转换类型后再运算
修复方法
- →用 type() 检查变量的实际类型
- →字符串和数字运算前先转换:int(), float(), str()
- →检查函数参数类型是否符合要求
- →列表和字典不能直接比较大小,需要先转换
05
IndexError
访问了列表/元组中不存在的索引
# 错误示例
nums = [1, 2, 3]
print(nums[3]) # 下标最大为 2
# 正确写法
nums = [1, 2, 3]
for i in range(len(nums)):
print(nums[i])
修复方法
- →列表长度为 n 时,合法下标为 0 到 n-1
- →循环时用 range(len(arr)) 或直接 for item in arr
- →访问前先检查:if index < len(lst)
- →print(len(nums)) 确认列表实际长度
06
KeyError
访问字典中不存在的键
# 错误示例
student = {"name": "Alice", "grade": "A"}
print(student["score"]) # "score" 键不存在
# 正确写法(两种方法)
print(student.get("score", 0)) # 不存在时返回默认值
if "score" in student: # 先检查键是否存在
print(student["score"])
修复方法
- →优先用 dict.get(key, default) 代替直接访问
- →用 if key in dict 提前判断键是否存在
- →打印 print(dict.keys()) 查看所有可用键
- →注意键名大小写和空格
07
AttributeError
访问对象上不存在的属性或方法
# 错误示例
nums = [3, 1, 2]
nums.sort()
print(nums.length) # 应该是 len(nums) 而不是 .length
# 正确写法
nums = [3, 1, 2]
nums.sort()
print(len(nums))
修复方法
- →用 dir(obj) 查看对象的所有可用属性和方法
- →Python 中获取长度用 len(),不是 .length(那是 JavaScript)
- →字符串操作用 .upper() .lower() .strip(),不是 .toUpperCase()
- →None 类型没有任何属性,先检查变量是否为 None
08
ImportError / ModuleNotFoundError
导入的包未安装或包名拼写错误
# 错误示例
import numpy as np # 如果 numpy 未安装
# 解决方法
# 在终端运行:
# pip install numpy
# 或 conda install numpy(Anaconda 环境)
修复方法
- →运行 pip install <包名> 安装缺失的包
- →确认包名拼写正确(import numpy,不是 import Numpy)
- →虚拟环境中先激活:conda activate env_name
- →检查 requirements.txt 中是否包含该依赖
09
ValueError
函数收到了类型正确但值不合法的参数
# 错误示例
int("hello") # 字符串无法转为整数
float("1.2.3") # 格式错误
# 正确写法
try:
value = int(input("输入数字:"))
except ValueError:
print("请输入有效的整数")
修复方法
- →对用户输入的转换用 try/except 包裹
- →确认传入的字符串确实是纯数字
- →数学运算:math.sqrt() 的参数不能为负数
10
RecursionError
递归函数没有正确的终止条件,无限递归导致栈溢出
# 错误示例
def factorial(n):
return n * factorial(n - 1) # 没有基础情况
# 正确写法
def factorial(n):
if n == 0 or n == 1: # 基础情况(base case)
return 1
return n * factorial(n - 1)
修复方法
- →每个递归函数都必须有明确的基础情况(base case)
- →确认每次递归调用都在向基础情况靠近
- →用 print() 打印递归参数观察是否正常递减
- →也可以用迭代(循环)代替递归
通用调试技巧
01
先看最后一行
Traceback 从下往上读,错误类型和原因在最后一行,出错位置在倒数第二行。
02
用 print() 追踪变量
在怀疑出错的位置前加 print(var) 输出变量值,确认变量的实际内容和类型。
03
缩小范围
注释掉一半代码,看问题在哪半边——用二分法快速定位出错区域。
04
查看完整 Traceback
不要只看最后一行,往上的调用链告诉你问题从哪个函数传递过来的。
05
逐行运行
在 Jupyter Notebook 中把代码分成多个 cell,逐步执行,看哪一步开始出错。
06
搜索报错信息
复制 Traceback 最后一行到 Google(加上你的 Python 版本),99% 的报错都有人遇到过。