编程调试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% 的报错都有人遇到过。

报错解决了,但作业还是写不完?

我们的 CS 代写团队精通 Python、Java、C++ 等主流语言,从 debug 到完整项目实现,准时交付,附详细注释。