
exec() 执行语句但不返回或打印表达式结果;eval() 则求值并返回结果,类似交互式解释器的自动显示机制。理解二者设计定位差异,是正确捕获动态代码输出的关键。
python 中 exec() 与 eval() 的输出行为差异详解:`exec()` 执行语句但不返回或打印表达式结果;`eval()` 则求值并返回结果,类似交互式解释器的自动显示机制。理解二者设计定位差异,是正确捕获动态代码输出的关键。
在 Python 交互式解释器(REPL)中,输入 a = 1 后再单独输入 a,会自动显示 1——这是 REPL 的“表达式求值与隐式打印”机制:它对每条非赋值、非语句的表达式调用 repr() 并输出。但 exec() 的设计目标完全不同:它专用于执行任意语句块(statements),如赋值、循环、函数定义等,其语义等价于将代码写入 .py 文件后运行,因此不返回值,也不自动打印任何表达式的结果。
例如:
>>> exec("a = 1\nprint(a)") # ✅ print() 是显式语句,会输出 1
1
>>> exec("a = 1\na") # ❌ 'a' 是表达式,exec 不做隐式显示,无输出
>>>
而 eval() 仅接受单个表达式(expression),并返回其计算结果,这正契合了 REPL 中“输入表达式即显示结果”的行为:
>>> a = 1
>>> eval("a") # 返回 1,可在脚本中捕获
1
>>> result = eval("a + 2")
>>> print(result) # 输出:3
3
⚠️ 注意事项:
-
exec()适用于运行多行逻辑(含if、for、def),但需用print()显式输出; -
eval()仅支持单个表达式,传入语句(如"a = 1")会抛出SyntaxError; - 二者均存在安全风险,切勿执行不可信的字符串代码(如用户输入),建议优先使用
ast.literal_eval()处理简单字面量。
✅ 正确捕获动态表达式结果的推荐方式:
# 若需执行并获取表达式值(如模拟 REPL 行为)
code = "a + b"
namespace = {"a": 5, "b": 3}
result = eval(code, {"__builtins__": {}}, namespace) # 限制内置函数提升安全性
print(result) # 输出:8
总结:exec 是“执行引擎”,eval 是“求值器”。选择取决于你的需求——要运行逻辑?用 exec;要获取计算结果?用 eval(并确保输入是合法表达式)。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











