【问题标题】:write a copy of an int to a dictionary将 int 的副本写入字典
【发布时间】:2018-11-27 01:40:47
【问题描述】:

我正在使用“SciPy.optimize”并且在生成一些约束时遇到了一些麻烦。

我正在尝试使用循环将条目添加到字典中。循环的索引 i 应写入字典。但是只有一个对字典的引用。所有的函数都是 {'type': 'ineq', 'fun': lambda x: MyFunction(x,True, 19)} 因为 19 是 i 的最大值。 (数组有 20 个对象。)所以结果是,所有函数的输出都是 19。

con1 = {'type': 'eq', 'fun': MyFirstFunction} 
cons = ([con1])

for i, m in enumerate(myobject.getAsNpArray()):
    cons.append({'type': 'ineq', 'fun': lambda x: MyFunction(x,True, i)})


def MyFunction(x,myBool, i):
    print(i)
    #do some fancy stuff

我该如何解决这个问题?这样的事情不起作用:

cons.append({'type': 'ineq', 'fun': lambda x: MyFunction(x,True, copy.copy(i))})

【问题讨论】:

    标签: python python-3.x lambda scope scipy


    【解决方案1】:

    问题是当lambda调用 时,您的lambda 的主体从周围范围读取i,而不是在它被定义 时。由于lambda在循环完成后被调用,当它返回从嵌套作用域读取i时,它会得到ifinal值。

    一个简单的解决方案是将i绑定为lambda的默认参数;参数默认值在函数定义时绑定,而不是在调用时绑定,因此您可以在创建 lambda 时使用它来锁定 i

    cons.append({'type': 'ineq', 'fun': lambda x, i=i: MyFunction(x, True, i)})
    #                            change is here ^^^^^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      相关资源
      最近更新 更多