Python中如何对含变量的字符串表达式执行数值积分?
问题原因
你给eval()传入第二个参数作为自定义全局命名空间后,eval就只会在你提供的这个字典中查找所有用到的变量,不会再到外层lambda函数的作用域里找x,而你传入的paramsDict里只有A、B两个参数,自然会提示找不到x。
解决方法
eval本身支持第三个参数作为局部命名空间,你只需要把lambda传入的积分变量x放到局部命名空间里传给eval即可:
from scipy.integrate import quad equation = 'A+B*x' paramsDict = {'A':1, 'B':2} # 第三个参数传入局部变量x,eval查找顺序:局部命名空间 → 全局命名空间 result = quad(lambda x: eval(equation, paramsDict, {'x': x}), 0, 1) print(result)
你也可以选择把x直接合并到全局命名空间字典里,效果完全一致:
result = quad(lambda x: eval(equation, {**paramsDict, 'x': x}), 0, 1)
补充(新手友好说明)
eval()的完整参数规则是eval(待执行表达式, 全局变量字典, 局部变量字典):
- 如果你传了自定义全局变量字典,
eval就不会使用当前代码运行环境的全局变量,只会在你给的这个字典里找变量 - 如果同时传了局部变量字典,
eval会先在局部字典里找变量,找不到再去全局字典里找,都找不到才会报错
内容的提问来源于stack exchange,提问作者asdf
相关产品推荐
相关产品推荐

