跳到内容

元数据卡

  • 前置知识:第3章(Git) + 本章 IDE 配置
  • 预计时间:15 分钟
  • 阅读模式:高度专注 + 边读边敲
  • 完成标志:能设断点、步过/步进、看 VARIABLES 面板

你的进度

你已经架好了操作台(IDE)。但你还在用最原始的方法排查故障——往代码里塞 print(),跑一遍、看输出、改代码、再跑。

"我受够了每次刮铁屑、记读数、再刮铁屑的循环了。"

是时候让程序在运行时停住,让你亲眼看看里面发生了什么了。


第一场战斗:print() 打到手软

假设这是你有 bug 的代码:

python
# material_checker.py
def get_qualified_items(items, n=10):
    valid = []
    for it in items:
        if it["weight"] > 0:
            valid.append(it)
    sorted_items = sorted(valid, key=lambda x: x["weight"], reverse=True)
    return sorted_items[:n]

items = [
    {"id": 1, "weight": 100},
    {"id": 2, "weight": 0},
    {"id": 3, "weight": 200},
    {"id": 4, "weight": -50},
]
print(get_qualified_items(items, 2))

语言: Python 3 如何运行: python material_checker.py问题: 重量为 -50 的工件没有被过滤掉——条件 > 0 本意是排除所有非正重量,但 -50 进来了。

传统做法:在每一行塞 print(it),跑一遍,删掉 print(),再跑一遍验证。改代码的代价打断了调试的节奏。

你能用一种更好的办法。


获得第一个技能:断点

断点就是你告诉调试器:"代码执行到这行,给我停住。"

在 VS Code 里,点一下行号左侧的空白——一个红色圆点出现:

python
# 调试器会在每次循环到这行时暂停
for it in items:
if it["weight"] > 0:  # ← 红点 = 断点
    valid.append(it)

如何运行:F5 或点 VS Code 左边栏"运行和调试" → 选择"Python File" 预期效果: 编辑器停在那一行,整行高亮,程序在等你下指令。


调试工具栏:你的方向舵

程序停住后,顶部出现调试工具栏:

▶ 继续 | ⤵ 步入 | ⤴ 步出 | 重启 | 停止
按钮快捷键用途
继续F5运行到下一个断点或结束
步过F10执行当前行,停到下一行(不进入函数内部
步进F11进入当前行调用的函数内部
步出Shift+F11跳出当前函数,回到调用者

选步过还是步进? 简单的规则:如果你想知道 sorted() 怎么写的不,用 步过;如果你想看自己写的函数怎么跑的,用 步进


看看变量在发生什么

断点停住时,VS Code 左边栏自动出现 VARIABLES 面板:

VARIABLES
 Locals
 it: {'id': 1, 'weight': 100}
 items: [{'id': 1, 'weight': 100} ...]
 valid: []
 n: 10

你不必猜测 it["weight"] 等于多少——你亲眼看到了。


第一场战斗的复盘

断点停在 if it["weight"] > 0 上。当 it 轮到 {"id": 4, "weight": -50} 时:

  • 条件成立吗?→ -50 > 0False
  • 那它进不进 valid?→ 不进

如果你真正想过滤的是 weight < 0 的废品(0 重量是正常空工件),条件应该是 >= 0。断点在每次循环暂停时,你看一眼分支走向就知道了——不需要 print() 来回折腾。


下一步

你学会了让程序停下来、一步步走。但遇到了更棘手的情况:一万个循环里只有一个 bug,我不想每次按 F5;函数调用链太深,我不知道谁调了谁。进阶调试技能就在下一站。

Built with VitePress | Software Systems Atlas