exec()
和 eval()
都是 Python 中用于执行字符串中 Python 代码的函数,但它们之间存在一些重要的区别:
- 返回值:
eval()
函数会计算字符串中的表达式并返回结果,而exec()
函数则不会返回任何值(返回None
)。
result = eval("2 + 3") print(result) # 输出:5 exec("x = 2 + 3") print(x) # 输出:5,但 x 的值不会赋给一个变量
-
安全性:
eval()
只能计算单个表达式,而exec()
可以执行任意复杂的 Python 代码。因此,exec()
的安全性较低,因为它可能会执行恶意代码。在处理不受信任的输入时,应尽量避免使用exec()
。 -
作用域:
eval()
函数会使用当前作用域的变量,而exec()
函数则会创建一个新的作用域来执行代码。
x = 1 y = 2 eval("print(x + y)") # 输出:3 exec("x = 1\ny = 2\nprint(x + y)") # 输出:3,但 x 和 y 的值不会保留在作用域中
- 参数:
eval()
只需要一个字符串参数,而exec()
需要更多的参数,包括要执行的代码字符串以及可选的局部变量和全局变量字典。
x = 1 y = 2 eval("print(x + y)") # 输出:3 exec("print(x + y)", {}, {"x": 1, "y": 2}) # 输出:3,使用局部变量和全局变量字典
总之,eval()
和 exec()
都可以执行字符串中的 Python 代码,但它们的用途和行为有所不同。在大多数情况下,应尽量避免使用 exec()
,特别是当处理不受信任的输入时。如果需要执行简单的表达式求值,可以使用 eval()
。