【问题标题】:Define a list of lambdas in Python that is eagerly evaluated [duplicate]在 Python 中定义一个被热切评估的 lambda 列表[重复]
【发布时间】:2015-05-18 11:49:45
【问题描述】:

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

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

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

【问题讨论】:

  • 也许我理解错了,但create a list of functions, each of which returns a dictionary with a specific key, and always the same value 与字典列表有何不同?
  • @SuperBiasedMan:这些值将在稍后评估。
  • @SuperBiasedMan 主要区别是我正在寻找函数列表(实际上是可调用对象),而字典列表是不可调用的。换句话说,我需要能够打电话给l2[0]('something')
  • 众所周知的 Python 作用域问题。简答:gen = (lambda _, f=f: {f: 42} for f in range(3)),这里长答stackoverflow.com/questions/12423614/…

标签: python lambda closures lazy-evaluation


【解决方案1】:

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

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

正如@Jon Clements 所指出的那样,该术语是惰性绑定,在Common_Gotchas_In_Python 中有描述

【讨论】:

  • 如果你愿意,你可以在sopython 上的“Lazy Binding”中详细说明这句话...:p
  • @JonClements,有缺口 ;)
【解决方案2】:

首先,这取决于您使用的是哪个 python 版本。 Pyhton3 为大多数迭代器创建惰性生成器。所以你可以这样做:

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

或者如果你的 lambda 需要一个输入参数

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2016-05-04
    • 2020-01-12
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多