在Python中定义一个渴望评估的lambda列表

在Python中定义一个渴望评估的lambda列表,python,lambda,closures,lazy-evaluation,Python,Lambda,Closures,Lazy Evaluation,我想以编程方式创建一个函数列表,每个函数都返回一个带有特定键的字典,并且总是相同的值。即: 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] 这还

我想以编程方式创建一个函数列表,每个函数都返回一个带有特定键的字典,并且总是相同的值。即:

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\u clousures
彼此比较,它们都是一样的:

x[0].func_closure == x[1].func_closure == x[2].func_closure  # this is True

获得我想要的结果的最佳方法是什么?

您正在为所有lambda分配
f
的最后一个值:

gen = (lambda _,f=f: {f: 42} for f in range(3))

正如@Jon Clements善意地指出的,术语是惰性绑定,这在中有描述,首先它取决于您使用的python版本。Pyhton3为大多数迭代器创建惰性生成器。所以你可以这样做:

l2 = list([lambda: {f: 42} for f in range(3)])
或者如果您的lambda需要输入参数

l2 = list([lambda f: {f: 42} for f in range(3)])

也许我误解了,
如何创建一个函数列表,每个函数都返回一个带有特定键的字典,并且总是相同的值
与一个dict列表有什么不同?@SuperBiasedMan:这些值将在以后进行评估。这可能有助于@SuperBiasedMan。主要区别是我正在寻找一个函数列表(可调用对象,真的)而dict列表是不可调用的。换句话说,我需要能够调用
l2[0]('something')
。众所周知的Python作用域。简短回答:
gen=(lambda,f=f:{f:42}对于范围(3)中的f))
,这里的长答案你可以从“惰性绑定”中详细描述这句话如果你想的话,请打开p@JonClements,刻痕;)