我正在尝试创建一个函数列表,然后将其应用于数字列表。为此,我遍历了一系列数字,并用 for 循环中的每个数字定义了一个 lambda 函数。然后使用第二个 for 循环将每个函数应用于同一个包含 10 个数字的列表。
问题是我的 lambda 列表似乎都采用 for 循环的最终值。
fx_lst = []
for k in range(1,3,1):
func = lambda x_: k * x_
fx_lst.append(func)
xlst = range(1,10,1)
for fx in fx_lst:
ylst = map(lambda xin_: fx(xin_), xlst)
print i, ylst
最后一期打印: [2,4,6...18] [2,4,6...18]
显然,我对 lambda 存储变量信息的方式不太了解。
最佳答案
发生的事情是您的 lambda 被绑定(bind)到循环变量 k
而不是与其关联的值,仅此而已。循环变量 k
即使在循环之后仍然存在,因此那些 lambda 可以访问它。
我知道的一个可能的解决方案是 lambda
柯里化(Currying):
In [129]: fx_lst = []
...: for k in range(1,3,1):
...: func = (lambda k=k: lambda x_: k * x_)(k)
...: fx_lst.append(func)
...:
In [130]: fx_lst[0](3)
Out[130]: 3
In [131]: fx_lst[1](3)
Out[131]: 6
函数 (lambda k=k: lambda x_: k * x_)(k)
基本上是一个高阶函数,它通过固定一个参数将一个接受两个参数的函数简化为一个接受一个参数的函数预先设定的参数常量。作用域由 k=k
固定,因此外部循环变量不会与 lambda 的作用域冲突。
对于你的例子,我得到
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 4, 6, 8, 10, 12, 14, 16, 18]
另一种解决方法是改用 functools.partial
,它的作用完全相同。
关于python - 在另一个列表上应用 lambda 函数列表时的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46029578/