2024-05-16 21:50:11 发布
网友
我试图制作一个程序,创建一个lambda函数列表,格式为y=mx+b,其中'm'和'b'是预先确定的值
y=mx+b
我的总体目标是实现一个功能
基本上,像霍夫变换之类的东西,如果你知道那是什么的话。在
一旦我有了一个特定图像的线,我就可以创建一个lambda函数来表示直线的斜率和它的起点。我遇到了一个问题,无法将lambda函数附加到列表中。在
我试过了:
以下是我得到的错误:
这会给你一个线索:
>>> i=1 >>> a=lambda x:x+i >>> a(5) 6 >>> i=2 >>> a(5) 7
lambda在外部作用域中使用i。在OP的情况下,所有函数都是相同的。在最后一个循环中使用i使i成为函数,而不是整数。将其更改为其他值,您将发现函数都是相同的,使用最后一个值i:
lambda
i
10 10 10 10 10 10 10 10 10 10
解决方法是,将i作为函数的参数,将值捕获为局部变量:
nums = [] for i in range(10): j = lambda x,i=i: x + i nums.append(j) for f in nums: print(f(1))
1 2 3 4 5 6 7 8 9 10
问题是您创建的lambda引用的是活动堆栈框架中的当前值i。当您稍后在第二个for循环中重用i时,它将绑定到列表中的lambda。当作为i(1)调用时,lambda正试图计算1 + i,其中{}是lambda,因此您当然会得到一个错误。在
for
i(1)
1 + i
可能您想要的是在lambda创建点冻结i的值。您可以通过替换:
j = lambda x: x + i
有:
这通过将i绑定到lambda变量,然后立即应用该lambda,在该lambda之后绑定保持不变,从而有效地捕获当前值。在
你的价值观已经改变了,这不是你想的那样。在
首先创建lambda:
希望我将保持为当前值(所以0、1、2等等)。在
然后执行它:
你看到了吗,你如何命名第二个迭代器变量i?将其更改为j,您的示例将起作用。为什么?因为python在lambda中解析i的值,而不是在定义它时。所以当你执行你的lambda(i(1)),它会进入你的lambda身体并尝试x+i。然后它将查找i,它现在包含lambda(不是整数!)。所以你的问题。在
你需要做双重功能才能使它正常工作。试试这个:
if __name__ == "__main__": nums = [] for i in range(10): def generate_lambda(i): return lambda x: x + i j = generate_lambda(i) nums.append(j) for i in nums: print(i(1))
为什么这个有用?当您调用generate\u lambda时,将有一个带有整数值的i变量。它将隐藏变量i,稍后用于迭代lambdas。而且,由于您从未修改generate-lambda函数中的i变量,它将永远保持不变。在
这会给你一个线索:
^{pr2}$lambda
在外部作用域中使用i。在OP的情况下,所有函数都是相同的。在最后一个循环中使用i
使i
成为函数,而不是整数。将其更改为其他值,您将发现函数都是相同的,使用最后一个值i
:解决方法是,将
i
作为函数的参数,将值捕获为局部变量:问题是您创建的lambda引用的是活动堆栈框架中的当前值}是lambda,因此您当然会得到一个错误。在
i
。当您稍后在第二个for
循环中重用i
时,它将绑定到列表中的lambda。当作为i(1)
调用时,lambda正试图计算1 + i
,其中{可能您想要的是在lambda创建点冻结
i
的值。您可以通过替换:有:
^{pr2}$这通过将
i
绑定到lambda变量,然后立即应用该lambda,在该lambda之后绑定保持不变,从而有效地捕获当前值。在你的价值观已经改变了,这不是你想的那样。在
首先创建lambda:
希望我将保持为当前值(所以0、1、2等等)。在
然后执行它:
^{pr2}$你看到了吗,你如何命名第二个迭代器变量i?将其更改为j,您的示例将起作用。为什么?因为python在lambda中解析i的值,而不是在定义它时。所以当你执行你的lambda(i(1)),它会进入你的lambda身体并尝试x+i。然后它将查找i,它现在包含lambda(不是整数!)。所以你的问题。在
你需要做双重功能才能使它正常工作。试试这个:
为什么这个有用?当您调用generate\u lambda时,将有一个带有整数值的i变量。它将隐藏变量i,稍后用于迭代lambdas。而且,由于您从未修改generate-lambda函数中的i变量,它将永远保持不变。在
相关问题 更多 >
编程相关推荐