Python调试时怎么用print同时输出变量名和值

Ada
Ada
发布时间:2026-11-01| 9人浏览过
原创

介绍在Python调试过程中,如何使用print同时输出变量名与变量值的实用方法,重点解析Python 3.8引入的f-string自说明调试语法f'{var=}'及兼容旧版本的实现方式。

在日常使用 Python 调试程序时,若想通过 print 同时输出变量名和它的值,最直接高效的方法是使用 Python 3.8 引入的 f-string 调试语法:在表达式后紧跟等号,即 print(f"{var=}")。该语法会自动将等号左侧的表达式文本与右侧计算求值的结果一并打印出来,省去了手动重复书写变量名字符串的繁琐与出错可能。对于旧版本 Python 或复杂数据调试,也有对应的兼容写法与进阶技巧。

一、核心解决方案:Python 3.8+ 的 f-string 调试语法

自 Python 3.8 版本起,格式化字符串字面值(f-string)增加了对 = 说明符的原生支持。这一特性的主要设计目的就是为了简化 print 调试体验。

常规的手动拼接方式通常需要重复输入两遍变量名:

# 传统的手工书写方式
user_name = "Alice"
score = 98.5

print("user_name =", user_name)
print(f"score = {score}")

示例输出:

user_name = Alice
score = 98.5

如果改用 f"{var=}" 语法,代码可以大幅简化:

# 使用 f-string 调试语法
user_name = "Alice"
score = 98.5

print(f"{user_name=}")
print(f"{score=}")

示例输出:

user_name='Alice'
score=98.5

仔细观察可以发现,f"{user_name=}" 对字符串类型输出了带有单引号包裹的 'Alice'。这是因为该调试语法默认调用了变量的 repr() 方法而非普通的 str() 方法,这样有助于在调试时清晰分辨出数值 123 与字符串 '123',或者察觉字符串中潜藏的空格与换行符。

Python调试时怎么用print同时输出变量名和值
图 1:使用 f"{var=}" 语法输出变量名与值的执行步骤

二、进阶技巧:格式化控制与复杂表达式

f"{var=}" 不仅限于输出单一变量,它还支持对输出格式做精细控制,并且可以直接包含计算表达式或方法调用。

1. 控制浮点数位数与填充对齐

在等号后面添加冒号 :,就可以继续书写标准的 f-string 格式说明符。例如保留两位小数:

pi_val = 3.1415926
ratio = 0.856

# 等号后接格式控制
print(f"{pi_val=:.2f}")
print(f"{ratio=:.1%}")

示例输出:

pi_val=3.14
ratio=85.6%

2. 包含数学运算与函数调用

该语法会将等号前面的完整代码字面量原样作为“名称”输出,因此任何合法的 Python 表达式都能直接使用:

width = 20
height = 10

print(f"{width * height = }")
print(f"{[x * 2 for x in range(3)] = }")

示例输出:

width * height = 200
[x * 2 for x in range(3)] = [0, 2, 4]

注意到等号两边的空格也会被原样保留。如果写成 f"{width * height = }",输出中等号两侧就会有相应的空格,方便排版对齐。

Python调试时怎么用print同时输出变量名和值
图 2:f"{expr=:.2f}" 内部结构的拆解与输出映射原理

三、常见认知偏差与技术辨析

在探讨如何输出变量名和值时,常会遇到一些看似合理但实际存在局限的认知,需要注意辨析:

1. 误区:能否编写一个通用函数 debug_print(var) 自动获取入参名字?

很多初学者会尝试定义一个函数:def dump(val): print(get_var_name(val), val)。这种做法在绝大多数情况下是不推荐的,因为在 Python 的运行机制中,函数调用传递的是对象的引用,而不是变量名本身。如果外部传入一个数字 dump(10),内存中根本没有变量名;即使通过 inspect 模块逆向扫描调用栈的字节码或局部符号表,一旦出现同名变量、多个变量指向同一对象或临时计算结果,就极易发生误判且性能损耗极大。因此,官方通过语言编译层面的 f"{var=}" 解决了这一问题,无需依赖脆弱的运行时反射。

2. 误区:使用 locals() 批量遍历打印是否最省事?

有时有人建议直接 print(locals()) 打印当前所有变量。虽然它确实包含了局部变量名与值,但输出内容通常包含内部变量、引入的模块、循环临时变量等大量噪声信息,不仅可读性差,还可能因为某些自定义对象庞大而产生巨量文本,干扰核心问题的排查。按需指定关键变量打印始终是更清晰的做法。

四、低版本 Python 的兼容方案对比

如果维护的项目运行在早于 Python 3.8 的环境中(例如 Python 3.6 或 3.7),直接使用 f"{var=}" 会触发 SyntaxError: invalid syntax 语法错误。此时可以选择以下两种替代方案:

方案 A:标准 f-string 手工书写(推荐)

# Python 3.6 / 3.7 适用
status_code = 404
message = "Not Found"

print(f"status_code={status_code!r}, message={message!r}")

通过追加 !r 转换标识,可以达到与新版调试语法一致的 repr() 效果。

方案 B:基于字典解包或循环(适合多变量并排检查)

# 当需要整齐打印一批已知变量时
host = "127.0.0.1"
port = 8080

debug_vars = {"host": host, "port": port}
print(", ".join(f"{k}={v!r}" for k, v in debug_vars.items()))

示例输出:

host='127.0.0.1', port=8080
Python调试时怎么用print同时输出变量名和值
图 3:新旧 Python 版本的调试输出方案特性对比

五、注意事项与实践建议

调试代码清理提醒:虽然 print(f"{var=}") 编写极其快捷,但散落在生产业务逻辑中的 print 语句可能带来不可控的性能损耗,甚至在敏感业务中泄露数据。调试结束后建议及时清理,或者在团队协作项目中改用标准库的 logging 模块记录带有上下文的调试日志。

  • 善用空格提升可读性:如果一行内输出多个变量,可以写为 print(f"{a=}, {b=}, {c=}"),等号后会自动带上对应的值,逗号则分隔各个项,使得控制台输出条理分明。
  • 留意敏感信息:打印包含用户密码、Token 等对象的类实例时,由于 {var=} 优先触发 repr(),若该类的 __repr__ 包含隐私属性,会被完整呈现在控制台中,排查公共环境时需多加注意。
  • 进阶第三方库推荐:如果你对控制台调试有更复杂的格式化需求(例如彩色高亮、打印调用文件与行号),可以了解第三方开源库 icecream(通过 ic(var) 实现类似功能),而在标准库不增加依赖的前提下,f"{var=}" 始终是第一选择。
Python调试时怎么用print同时输出变量名和值
图 4:Python print 变量名与值技巧全景总结
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。