【问题标题】:Dictionary comprehension with inline functions使用内联函数的字典理解
【发布时间】:2015-07-15 04:40:04
【问题描述】:

我需要将函数存储在字典中,每个函数都取决于它的键,比如说,对于一个键 1,关联的 lambda 函数是 lambda s: s * A[1]。我尝试使用 dict 理解,但似乎内联函数以循环的最后一个值定义结束。

d = {k, lambda s: s * A[k] for k in range(n)}  # e.g. n = 4

之后,所有创建的 lambda 函数都使用 A[3] 声明,而不是 A[0], A[1], A[2]A[3]。这段代码有什么问题?

【问题讨论】:

  • 至少生成的对象的打印确实是具有四个键的四个函数,0、1、2、3。字典理解的文档说这应该是正确的......我认为@987654321 @
  • 只是好奇你用这个做什么以及 A 和 s 是什么?
  • @Scott 我想存储一些涉及基本操作的函数(A 只是一个数组,例如 numpy 数组),然后使用一些像树这样的数据结构我想获得正确的索引来评估所需的我在叶子中找到的功能,但只是和想法:)

标签: python dictionary lambda


【解决方案1】:

解决方法是将代码更改为:

d = {k: lambda s, k=k: s * A[k] for k in range(n)}

如果没有绑定,Python 会在调用每个 lambda 时查找“当前”k,在原始代码中始终为 n-1

【讨论】:

    【解决方案2】:

    出现问题是因为 lambda 函数的内容在 lambda 函数执行之前不会执行。

    因此,每当您尝试调用 lambda 函数时,它都适用于 k 的最新值(如果您执行 del k 并尝试调用 lambda 函数,您应该会收到错误)。

    @YS-L 的回答应该对你有好处。

    另一种方法是使字典的值成为绑定方法,绑定k的值。示例 -

    >>> d = {k:(lambda k,s: s * A[k]).__get__(k) for k in range(n)}
    >>> d
    {0: <bound method int.<lambda> of 0>, 1: <bound method int.<lambda> of 1>, 2: <bound method int.<lambda> of 2>, 3: <bound method int.<lambda> of 3>}
    >>> A
    [1, 2, 3, 4]
    >>> d[0](1)
    1
    >>> d[1](1)
    2
    >>> d[2](1)
    3
    >>> d[3](1)
    4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 2019-07-29
      • 2018-04-07
      • 1970-01-01
      相关资源
      最近更新 更多