Python内置函数exec和eval

🧩 一、核心概念

函数功能返回值执行内容类型
eval(expression, globals=None, locals=None)计算字符串形式的 表达式 并返回结果✅ 返回表达式结果表达式(有值的)
exec(object, globals=None, locals=None)执行字符串或编译对象形式的 Python 语句❌ 没有返回值语句、函数定义、赋值、循环、类定义等

简单记忆:

  • eval → 计算表达式 → 有返回值
  • exec → 执行语句 → 没返回值


🧾 二、基本语法

# eval
eval(expression, globals=None, locals=None)

# exec
exec(object, globals=None, locals=None)
  • expression/object:字符串或编译后的代码对象
  • globals:可选,全局命名空间字典
  • locals:可选,局部命名空间字典


🧩 三、示例

1️⃣ eval 示例

x = 10
y = 5
expr = "x + y"
result = eval(expr)
print(result)  # 输出 15
  • 适合动态计算表达式,直接返回值
  • 可以访问全局变量和局部变量
ns = {"x": 2, "y": 3}
print(eval("x * y", ns))  # 输出 6


2️⃣ exec 示例

code = """
x = 10
y = 20
z = x + y
print(z)
"""
exec(code)
# 输出 30
  • 可以执行多行语句、函数定义、类定义
  • 没有返回值,但可以在执行时定义变量或函数
namespace = {}
exec("def add(a, b): return a + b", namespace)
print(namespace["add"](3, 4))  # 输出 7


🧩 四、适用场景

函数使用场景
eval动态计算表达式,获取值,例如 "obj.attr"、算术表达式、列表/字典索引
exec动态执行 Python 语句或多行代码,例如函数定义、类定义、赋值、循环


🧠 五、注意事项

  1. 安全性 eval / exec 执行的代码可以是任意 Python 代码 如果来源不可信(例如用户输入),会有严重安全风险 推荐使用 globals 和 locals 限制命名空间
  2. 性能问题 频繁使用 eval / exec 会比直接代码慢 尽量只在需要动态代码时使用
  3. 可读性与调试 exec/eval 的代码不易静态检查和调试 代码错误通常在运行时才发现


🧩 六、对比总结

特性evalexec
返回值没有
执行对象表达式语句、函数、类等
典型用途获取值、计算动态表达式执行动态代码、定义函数/类
安全风险高(尤其用户输入)高(尤其用户输入)


💡 一句话总结

eval → 得到结果;exec → 执行语句
文章标签:

评论(0)