为什么这个语句不起作用,我已经导入了数学库

问题描述

我正在尝试在 python 中使用 eval() 函数,但是我遇到了问题。

我已经导入了数学库,但仍然出现 NameError。我还尝试了 .replace() 方法来填充 xy 的值,但仍然出现相同的错误

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 的脚本的全局变量。解决方案是直接在脚本中定义变量 xy 以避免传递全局字典,或者将数学变量添加到该字典中。他们在我链接的站点上有一个示例,几乎与您遇到的问题相同。这是后一种解决方案的工作代码。

import math
eval('math.sin(x * y)',{'math': math,'x':'0.1','y':'0.1'})

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...