python - 在另一个列表上应用 lambda 函数列表时的意外行为

标签 python list lambda

我正在尝试创建一个函数列表,然后将其应用于数字列表。为此,我遍历了一系列数字,并用 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/

相关文章:

python - 从列表末尾删除零

python - 按字母顺序对二维列表进行排序?

c# - List.Any 得到匹配的字符串

python - 我可以在没有显示环境的情况下使用 tkinter

list - prolog 使用设置函数头将列表中的元素替换为另一个元素?

python - 在 sklearn 的双标图中绘制 PCA 加载和加载(类似于 R 的自动绘图)

c# - 如果不使用 lambda 表达式,这个 Parallel.ForEach 循环将如何完成?

haskell - 如何输入简单类型的 lambda 演算项 (S K K)

python - 使用 python 列表理解从列表中删除项目

python - 如何使用多个参数在python中加入url