问题描述
我正在尝试在 python 中使用 eval()
函数,但是我遇到了问题。
我已经导入了数学库,但仍然出现 NameError。我还尝试了 .replace()
方法来填充 x
和 y
的值,但仍然出现相同的错误。
import math
eval('(math.sin(x*y))',{'x':'0.1','y':'0.1'})
它给出了错误:
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
File "<string>",in <module>
NameError: name 'math' is not defined
解决方法
eval('(math.sin(x*y))',{'x':'0.1','y':'0.1'})
不起作用,因为 eval
的第二个参数是 globals
,第三个参数是 locals
。当您指定 globals
时,不能使用实际的全局变量。将您的参数作为 locals
传递:
eval('(math.sin(x*y))',None,{'x':0.1,'y':0.1})
也不要为此使用 eval
!这是危险!!
eval
的第二个参数是一个字典,其中包含您作为字符串传递的代码中全局定义的变量。而是read here了解更多细节,他们比我解释得更好!但是,当您省略 globals 字典时它会起作用,因为这样会使用您从中调用 eval
的脚本的全局变量。解决方案是直接在脚本中定义变量 x
和 y
以避免传递全局字典,或者将数学变量添加到该字典中。他们在我链接的站点上有一个示例,几乎与您遇到的问题相同。这是后一种解决方案的工作代码。
import math
eval('math.sin(x * y)',{'math': math,'x':'0.1','y':'0.1'})