在Python中定义一个热切评估的lambdas列表

时间:2015-05-18 11:49:46

标签: 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]

这还不够。事实上,如果你将func_clousures相互比较,它们都是一样的:

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

获得我正在寻找的结果的最佳方法是什么?

2 个答案:

答案 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)])