调用将 lambda 函数加在一起的自定义函数时内核重新启动

Posted

技术标签:

【中文标题】调用将 lambda 函数加在一起的自定义函数时内核重新启动【英文标题】:Kernel restarts when calling self defined function which adds together lambda functions 【发布时间】:2021-12-25 06:23:06 【问题描述】:

我尝试定义一个将多个 lambda 函数添​​加在一起的函数。 当我调用该函数时,内核崩溃并重新启动,没有更多错误消息。

def add_lambdas(function_list):
    f = lambda x, y: None
    for function in function_list:
        f = lambda x, y: f(x, y) + function(x, y)
    return f

f1 = lambda x, y: x + y
f2 = lambda x, y: x**2 - 2*y

f3 = lambda x, y: f1(x,y) + f2(x,y)
f4 = add_lambdas([f1,f2])

例如,当我调用 f3(2,3) 时一切正常,但当我调用 f4(2,3) 时,内核崩溃并重新启动。对于 f3,我手动添加 f1 和 f2,但对于 f4,我通过函数 add_lambdas() 传递它们。

这是输出:

In[5]: f3(2,3)
Out[5]: 3

In[6]: f4(2,3)

Restarting kernel...

显然我定义的函数有问题,但我不知道它是什么。有什么想法吗?谢谢!

【问题讨论】:

【参考方案1】:

我认为问题在于您将 f 定义为递归函数,我认为这不是您想要的。你可以试试这个:

def add_lambdas(function_list):
    return lambda x, y: sum(f(x, y) for f in function_list)

【讨论】:

【参考方案2】:

您遇到了堆栈溢出。问题是add_lambdas中只有一个变量f和一个变量function。当你写:

f = lambda x, y: f(x, y) + function(x, y)

您只是为变量f 分配了一个新值,但定义中的变量f 也是那个新值。这是堆栈溢出。此外,变量function 将保留列表中的最后一个值。它没有理由复制该值。

如果改为: f = lambda x, y, f=f, function=function: f(x, y) + function(x, y), 您是在告诉 Python 将 ffunction 分配给新变量(同名)并在 lambda 中使用这些新变量。对其他变量所做的更改无关紧要

您会在代码中发现另一个错误。第一行必须是 f = lambda x, y: 0,否则您将向 None 添加一个整数。


请注意,如果您只是计划添加内容,@josemz 是更简单的解决方案。如果您想学习在其他 lambda 中使用 lambda,则需要确保正确绑定变量。

【讨论】:

感谢您的解释!这很有帮助。 当你写像[lambda x: x + i for i in range(10)] 这样的东西时,这真的会让你感到痛苦。你认为你有一个包含 10 个函数的数组,第一个函数加 0,第二个函数加 1,以此类推。但是只有一个i,当我们完成i=9,所以你有一个由十个函数组成的数组,所有这些函数都加9。你需要写[lambda x, i=i: x + 1 for i in range(10)]以便i被复制到一个新变量。

以上是关于调用将 lambda 函数加在一起的自定义函数时内核重新启动的主要内容,如果未能解决你的问题,请参考以下文章

删除 Lambda 支持的自定义资源的支持 Lambda 函数

GLSL:找不到我的自定义函数

创建在特定事件发生时调用的自定义 appsync 解析器或 lambda 函数

Nodejs API调用将未定义返回给lambda函数

python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reducemapfilter)

无法通过自定义 cloudformation 资源调用 lambda 函数