python-3.x - 如何在 python3 中通过 for_loop 创建许多不同的 lambda 函数?
问题描述
我尝试通过以下代码创建不同的功能:
a = []
for i in range(5):
a.append(lambda: i)
print(a)
它显示了它:
[<function <lambda> at 0x008DA100>, <function <lambda> at 0x008DA0B8>, <function <lambda> at 0x008DA148>, <function <lambda> at 0x008DA190>, <function <lambda> at 0x008DA1D8>]
我发现所有的功能都不一样,但是后来我发现它不能工作。尽管所有功能都指向不同的地址,但所有功能都显示相同的编号:4;
a[0]()
4
a[1]()
4
a[2]()
4
a[3]()
4
a[4]()
4
请告诉我如何解决这个问题。
解决方案
您的 lambda 表达式都返回 4 的原因是它们都引用了相同的变量 - i
。循环结束后的值为i
4。由于 lambda 在调用时执行 - 所有 lambda 都评估相同的表达式:i
& 因此得到相同的结果。
为了解决这个问题,您需要将 i 的值绑定为 lambda 创建时间。为此,您可以使用具有默认值的单参数 lambda:
a = []
for i in range(5):
a.append(lambda x=i: x)
print(a[0]())
这使:
0
正如预期的那样。
推荐阅读
- c# - 在不阻塞应用程序的情况下运行 NSAlert app-modal
- sql - DataStudio ::: Count_Distinct 基于两个值的计算
- react-native - 我想在我的 About 组件上显示两张卡片,但我无法同时显示这两张卡片
- azure - 如何以编程方式从在 azure 上运行的托管容器化 Web 应用创建新实例?
- swift - 在 awakeFromNib() 方法中添加约束
- algorithm - 寻找节点t-friends的算法
- c# - System.IO.FileInfo 在 WIX 自定义操作中使用时将意外字符串添加到路径
- reactjs - 如何使用 docker-compose 构建和部署 ReactJs
- c# - 混合 2 个纹理 Unity C#
- android - 如何完全删除android中线性布局内的所有内容?