繁体   English   中英

python中的lambda函数的列表参数

[英]List argument for a lambda function in python

我使用scipy优化最小化程序包。 为了给我的问题提供约束,我需要创建一个庞大的元组。 我通过以下方式进行操作:

c0 = [];
count = 0;
for i in range(0, Nx):
    for j in range(0, Ny):
        c0.append({'type': 'eq', 'fun': lambda x:  x[count]*x[count] + x[T + count]*x[T + count] + x[2*T + count]*x[2*T + count] - 1.});
        count+=1;
cons = tuple(c0);

但是,当最小化器使用它们时,它将始终使用count的最终值,这显然会导致index out of bounds错误。 尝试del(count)导致另一个错误,所以我猜我对lambda函数用法的python方法的理解有问题。 也许有一种使用切片和其他东西的更好的python风格的方法吗? 将不胜感激。

调用lambda函数时会评估变量中的count变量,而不是在创建时进行评估(与某些其他语言不同)。 您需要做的是强制复制此变量,一种方法是使用闭包:

c0.append({
        'type': 'eq', 
        'fun': (lambda count: lambda x:  x[count]*x[count] + x[T + count]*x[T + count] + x[2*T + count]*x[2*T + count] - 1.) (count)
});

另一种方法(精细的IMO)是用作参数的默认值:

c0.append({
    'type': 'eq', 
    'fun': lambda x, count = count:  x[count]*x[count] + x[T + count]*x[T + count] + x[2*T + count]*x[2*T + count] - 1.
});

您在其中所做的是创建一个引用变量的函数对象,它不会创建自己的副本,因此当您执行该函数时,它将查找变量,该变量现在具有循环中的最后一个值。

@Holt闭合可能是完成任务的最安全方法,尽管有些复杂。 我将在闭包内更改变量的名称,以使情况更加清楚。

这样做是创建一个单独的范围,以便一旦执行离开外部lambda函数(调用它并返回一个值,该值实际上就是您想要的函数对象),则该函数对象中的count变量和循环中的count变量较长的引用在内存中的相同位置,您可以递增计数器而不会影响该函数引用的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM