我想以编程方式创建一个函数列表,每个函数都返回一个带有特定键的字典,并且始终具有相同的值。那就是:
l1 = [lambda _: {0: 42}, lambda _: {2: 42}, lambda _: {3: 42}]
我正在尝试以编程方式获得相同的结果。 为了避免懒惰评估的常见问题,我想我只需要创建一个生成器来动态生成函数:
gen = (lambda _: {f: 42} for f in range(3))
然后使用简单的列表推导来获取列表:
l2 = [f for f in gen]
这还不够。事实上,如果你将func_clousures
相互比较,它们都是一样的:
x[0].func_closure == x[1].func_closure == x[2].func_closure # this is True
获得我正在寻找的结果的最佳方法是什么?
答案 0 :(得分:3)
您正在为所有lambdas分配f
的最后一个值:
gen = (lambda _,f=f: {f: 42} for f in range(3))
正如@Jon Clements所指出的那样,这个术语是延迟绑定,在Common_Gotchas_In_Python
中有描述答案 1 :(得分:0)
首先,它取决于您使用的是哪个python版本。 Pyhton3为大多数迭代器创建了惰性生成器。所以你可以这样做:
l2 = list([lambda: {f: 42} for f in range(3)])
或者如果你的lambda需要一个输入参数
l2 = list([lambda f: {f: 42} for f in range(3)])