首页 > 解决方案 > eval()的奇怪行为与python循环中的lambda函数

问题描述

我有一个字符串输入文件如下(每行一个方程): 1.0 - x[0] - x[1] x[0] + x[1]

我试图在 python 中使用 eval() 将这些方程转换为 lambda 函数,然后在优化方案中使用它们。这是我所做的:

def gen_const(input):
    list = input.read_eqs()
    for i in list:
        m = lambda x: eval(i)
        cons.extend([{'type': 'ineq', 'fun': m}])
    return cons

这个缺点在优化方案中使用时会失败。但是,如果我只考虑循环内的第一轮(即第一个方程),则约束工作正常:

def gen_const(input):
    list = input.read_eqs
    for i in list[0:1]:
        m = lambda x: eval(i)
        cons.extend([{'type': 'ineq', 'fun': m}])
    return cons

奇怪的是,当我复制完全相同的方程式(从输入文件中复制,相同的字符,间距)时,它也可以正常工作:

def gen_const(input):
    list = input.read_eqs
    m0 = '1.0 - x[0] - x[1]'
    m1 = 'x[0] + x[1]'
    cons.extend([{'type': 'ineq', 'fun': lambda x: eval(m0)}])
    cons.extend([{'type': 'ineq', 'fun': lambda x: eval(m1)}])
return cons

所以我在循环中看到了 eval() 的这种奇怪行为,我真的被卡住了。我读过 eval 是邪恶的,并搜索了替代方案,但找不到更好的方法来解决我的问题。我将衷心感谢您的帮助。

标签: pythonfunctionlambdaconstraintseval

解决方案


推荐阅读