VS Code调试Python关键在理解launch.json作用、断点逻辑及变量监视器的实时性与惰性求值;断点不触发主因是调试器未绑定到目标Python环境,需显式配置"python"路径并确保与右下角解释器一致。

VS Code 调试 Python 代码不靠插件堆砌,关键在理解 launch.json 的实际作用、断点触发逻辑,以及变量监视器里哪些值是“实时快照”、哪些是“惰性求值”。
为什么加了断点却不暂停?检查 python.defaultInterpreterPath 和 justMyCode
断点失效最常见原因不是操作错误,而是调试器没绑定到你正在写的那个 Python 环境。VS Code 默认只调试当前工作区选中的解释器,如果 launch.json 里没显式指定 python 路径,它可能调起了系统 Python 或虚拟环境外的另一个版本。
-
launch.json中必须包含"python"字段,指向你pip list能看到依赖的那个解释器,例如:"python": "./venv/bin/python"(macOS/Linux)或"python": "./venv/Scripts/python.exe"(Windows) -
"justMyCode": true是默认值,但如果你在调试第三方库内部逻辑(比如想进requests.get),得设为false;不过设为false后断点可能在import行就停住,反而干扰——按需切换 - 确认终端右下角显示的 Python 版本和
launch.json一致,不一致时点击它手动切换
条件断点 和 日志点 比反复启停更省时间
在循环里逐次 F5 太慢,用条件断点直接跳到目标迭代;不想中断执行但又想看变量值?日志点比 print() 干净得多,且不污染源码。
- 右键断点 → “编辑断点”,输入表达式如
i == 99(注意:只能用当前作用域可见的变量,不能调函数或含副作用语句) - 右键断点 → “转换为日志点”,输入类似
Processing item {item.id}, count={len(items)},输出会出现在 Debug Console,不影响执行流 - 日志点里的表达式不支持 f-string 语法,必须用
{var}格式,且var必须已定义——未初始化就引用会报ReferenceError
变量监视器里看到的 __len__、__iter__ 不代表真实内容
VS Code 的 Variables 面板对容器类型(list、dict、dataclass)默认只展开一层,深层嵌套或自定义对象常显示方法名而非值,这不是 bug,是调试器为防卡死做的懒加载。
立即学习“Python免费学习笔记(深入)”;
- 鼠标悬停变量可看简略值,但悬停
numpy.ndarray或pandas.DataFrame只显示形状,不显示数据 —— 这是性能保护,不是读取失败 - 想强制展开某变量,在 Watch 面板里右键 → “Re-evaluate”,或直接在 Watch 输入框敲
my_list[:10]查看前 10 项 - 对
generator类型,Variables 面板显示,此时无法展开,必须先转成list(gen)再观察(注意内存消耗)
真正卡住调试效率的,往往不是不会设断点,而是误把 Variables 面板当“全量内存快照”——它只反映当前帧的局部视图,且对大对象、延迟计算对象、C 扩展对象(如 torch.Tensor)有明确取值限制。动手前先想清楚:你想验证的是逻辑分支,还是数据形态?前者靠条件断点,后者得配合 pprint 或临时导出到文件。










