跳到主要内容

专家就是在一个非常小的领域里犯过所有可能错误的人。

Niels Bohr物理学家

🔍 调试技巧

代码跑不通、输出不对、莫名报错——每个程序员都会遇到。"调试"就是找到问题原因的过程。本节介绍三种最实用的方法:print 调试、pdb 断点调试、IDE 可视化调试,从简单到高效逐步升级。

📌 本节要点

  • print 是最快的调试手段,适合快速排查
  • breakpoint() + pdb 可以暂停程序、检查变量、单步执行
  • IDE 调试器(VS Code / PyCharm)提供图形化断点、变量监视、调用栈
  • 遇到报错先读 Traceback,它会标明出错的文件、行号、调用链 :::
调试技巧快速体验

最朴素但最快的方法——在关键位置插入 print,看变量值:

Python
def calculate_average(numbers):
print(f"输入: {numbers}") # 调试:确认输入
total = sum(numbers)
print(f"总和: {total}") # 调试:确认计算
avg = total / len(numbers)
print(f"平均值: {avg}") # 调试:确认结果
return avg
Python
# 1. 打印变量名 + 值
x = 42
print(f"{x = }") # Python 3.8+ → x = 42

# 2. 打印类型
print(type(x)) # <class 'int'>

# 3. 打印位置信息
import traceback
traceback.print_stack() # 打印当前调用栈

# 4. 条件调试:只在特定条件下打印
for i in range(100):
if i % 10 == 0:
print(f"处理到第 {i} 项")
print 调试的局限
  • 需要改代码 → 改完记得删掉
  • 看不到完整的调用栈和变量作用域
  • 多个变量时输出杂乱

适合简单快速的问题。复杂问题请升级到 pdb 或 IDE 调试器。

读懂 Traceback

Python 报错时会打印 Traceback(回溯信息),这是调试的起点:

输出
Traceback (most recent call last):
File "main.py", line 10, in <module>
result = process(data)
File "main.py", line 5, in process
value = data["key"]
KeyError: 'key'

从下往上看:

  1. 最后一行:异常类型和消息 — KeyError: 'key'
  2. 倒数第二行:出错的代码 — value = data["key"]
  3. 再往上:调用链 — 谁调用了这个函数
调试思路
  1. 看异常类型:KeyError → 字典缺键、ValueError → 值不对、TypeError → 类型错误
  2. 看出错行号:line 5 → 打开文件看第 5 行
  3. 看调用链:从下往上追踪调用路径
  4. breakpoint() 在出错行之前,检查变量状态

常见报错速查

异常常见原因解决方向
NameError变量未定义检查拼写、是否在作用域内
TypeError类型不匹配检查传参类型,str(123) 转换
ValueError值不合理检查输入范围
KeyError字典缺键dict.get(key, default)key in dict
IndexError列表越界检查索引范围,len(list)
AttributeError对象无此属性检查拼写、import 是否正确
ImportError导入失败检查包名、是否安装、版本兼容
FileNotFoundError文件不存在检查路径、工作目录

实战:调试一个有 bug 的程序

下面这段代码有问题,试着用上面的方法找出并修复:

Python
# buggy.py

def find_longest(words):
"""找出列表中最长的单词"""
longest = ""
for word in words:
if len(word) > len(longest):
longest = word
return longest

words = ["apple", "banana", "cherry", "date"]
result = find_longest(words)
print(f"最长的单词是:{result}")
print(f"长度是:{result.length}") # ← bug 在这里

调试步骤

  1. 运行看报错
Shell
uv run python buggy.py
输出
最长的单词是:cherry
Traceback (most recent call last):
File "buggy.py", line 12, in <module>
print(f"长度是:{result.length}")
AttributeError: 'str' object has no attribute 'length'
  1. 读 TracebackAttributeError + 'str' object has no attribute 'length' → 字符串没有 .length 属性

  2. 修复:Python 字符串用 len() 函数,不是 .length 属性

Python
print(f"长度是:{len(result)}") # ✅ 修复

调试清单

遇到问题时按这个顺序排查:

  1. 读报错信息 — 异常类型 + 行号能解决 80% 的问题
  2. print 关键变量 — 在报错行之前打印变量值
  3. 加断点 — 用 breakpoint() 或 IDE 断点逐行检查
  4. 简化复现 — 去掉无关代码,找到最小复现步骤
  5. 搜索 — 把错误信息贴到搜索引擎,通常有人遇到过同样的问题