如何将 lambda 附加到 python 中的列表?

Kei*_*Kei 3 python lambda append

我正在尝试制作一个程序来创建格式的 lambda 函数列表y=mx+b,其中“m”和“b”是预先确定的值

我的总体目标是实现一个功能,

  • 拍照
  • 找到上面的线条
  • 以纯色将它们扩展到整个图片

基本上,如果你知道那是什么,像霍夫变换的东西。

一旦我有了特定图像的线条,我就可以创建一个 lambda 函数来表示线条的斜率及其起点。我遇到了无法将 lambda 函数附加到列表的问题。

我试过这个:

if __name__ == "__main__":
  nums = []
  for i in range(10):
    j = lambda x: x + i
    nums.append(j)
  for i in nums:
    print(i(1))
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

Traceback (most recent call last):
  File "C:/Users/me/.PyCharmCE2018.3/config/scratches/scratch_3.py", line 7, in <module>
    print(i(1))
  File "C:/Users/me/.PyCharmCE2018.3/config/scratches/scratch_3.py", line 4, in <lambda>
    j = (lambda x: x + i)
TypeError: unsupported operand type(s) for +: 'int' and 'function'
Run Code Online (Sandbox Code Playgroud)

Tom*_*zes 6

问题是您创建的 lambda 引用i了活动堆栈帧中的当前值。当您稍后重用i第二个for循环时,它会绑定到列表中的 lambda。当调用 as 时i(1),lambdas 试图评估lambda1 + i在哪里i,所以当然你会得到一个错误。

可能您想要的是i在创建 lambda 时冻结 的值。您可以通过替换来做到这一点:

j = lambda x: x + i
Run Code Online (Sandbox Code Playgroud)

和:

j = (lambda y: lambda x: x + y)(i)
Run Code Online (Sandbox Code Playgroud)

这通过将 的当前值i绑定到 lambda 变量,然后立即应用该 lambda 来有效地捕获当前值,之后绑定保持固定。

  • 或者 `lambda x, i=i: x + i` (2认同)

Mar*_*nen 5

这会给你一个线索:

>>> i=1
>>> a=lambda x:x+i
>>> a(5)
6
>>> i=2
>>> a(5)
7
Run Code Online (Sandbox Code Playgroud)

lambda在外部作用域中使用 i 。在OP情况下,所有功能都是相同的。i在最后的循环中使用会生成i一个函数,而不是一个整数。将其更改为其他内容,您会发现功能都是相同的,使用的是最后一个值i

nums = []
for i in range(10):
    j = lambda x: x + i
    nums.append(j)
for f in nums:
    print(f(1))
Run Code Online (Sandbox Code Playgroud)
10
10
10
10
10
10
10
10
10
10
Run Code Online (Sandbox Code Playgroud)

解决方法是,i为函数添加一个参数,以将值捕获为局部变量:

nums = []
for i in range(10):
    j = lambda x,i=i: x + i
    nums.append(j)
for f in nums:
    print(f(1))
Run Code Online (Sandbox Code Playgroud)
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)