python - 通过 lambda 定义的函数列表的意外行为

标签 python python-3.x

<分区>

我想了解为什么下面的两个打印会产生不同的结果:

f = [lambda x: x**2, lambda x: x+100]
f_new = [lambda x: fi(x) for fi in f]
print( [fi(2) for fi in f] )
print( [fi(2) for fi in f_new] )

输出是:

[4, 102]
[102, 102]

最佳答案

f_new 中的两个 lambda 实际上调用了同一个函数。

这是因为该列表由捕获 fi 变量(在编译时)但实际上并不执行函数的 lambda 构成。因此,当列表通过生成器 ... for fi in f 时,生成的 lambda 都使用捕获的变量 fi 并以相同的函数指针结束(即 f)

中的最后一个

您需要在理解中使用 fi 的当前值以避免这种捕获副作用:

f_new = [(lambda fn:lambda x: fn(x))(fi) for fi in f]
print( [fi(2) for fi in f_new] )
[4, 102]

关于python - 通过 lambda 定义的函数列表的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66341418/

相关文章:

python - 寻找最大公约数(作业打错了,我迫切需要你的帮助)

python - 在 Tensorflow/Keras 中获取对称矩阵的上三角最有效的方法是什么?

python - 如何避免在处理 KeyboardInterrupt 后打印 ^C

python - torndb(MySQLdb) 查询参数不起作用

python - @gen.coroutine 注解的理解

string - Python 转换字母数字

javascript - 在 Python 中服务器端组装 Javascript 模块的最佳方法是什么?

Python 战斗序列

python-3.x - OSError : [E050] Can't find model 'de' . 它似乎不是快捷链接、Python 包或数据目录的有效路径

Python3 以奇怪的方式处理非 ASCII 字符