<分区>
我想了解为什么下面的两个打印会产生不同的结果:
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]
标签 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) 查询参数不起作用
javascript - 在 Python 中服务器端组装 Javascript 模块的最佳方法是什么?
python-3.x - OSError : [E050] Can't find model 'de' . 它似乎不是快捷链接、Python 包或数据目录的有效路径