【问题标题】:How to create one dictionary with functions printing their names as value [duplicate]如何创建一个字典,其中函数将其名称打印为值[重复]
【发布时间】:2012-11-28 08:30:20
【问题描述】:

可能重复:
What’s going on with the lambda expression in this python function?
What do (lambda) function closures capture in Python?

例如,我有一个字符串列表 ['a', 'b', 'c']。

我想生成一个字典,将该列表中的元素('a'、'b'和'c')作为键,并生成一个将键作为值打印的函数(print('a')、print ('b'), 打印('c'))

  from __future__ import print_function
  l = ['a', 'b', 'c']
  m = {k: lambda : print(k) for k in l}

我写了上面的代码。但结果不对

  m['a']()
  c
  m['b']()
  c

我知道如果我不在那里使用 lambda

m = {k:print(k) for k in l}

这没问题。但我想知道为什么 lambda 在这里不起作用。

知道如何解决这个问题吗?谢谢

【问题讨论】:

  • @josh-lee 你是对的。但似乎答案不同。

标签: python lambda


【解决方案1】:

你得到c作为每个键的输出的原因是因为c在迭代中排在最后,所以x的最终值在这里是c,你的程序可以展开如下:

    for x in lis:
        def func():
            print(x)
        dic[x]=func

这里您的函数实际上是访问全局变量x 的值,而不是局部变量。在迭代结束时xc,你得到c 作为答案。

因此您需要使用默认参数将值存储在局部变量中。

正确的代码:

    In [2]: lis=['a', 'b', 'c']

    In [3]: dic={x:lambda i=x:print(i) for x in lis}

    In [4]: dic['a']
    Out[4]: <function __main__.<lambda>>

    In [5]: dic['a']()
    a
    In [6]: dic['b']()
    b

或:

In [16]: for x in lis:
    def func(i=x):
        print(i)    
    dic[x]=func
   ....:     

In [17]: dic['b']()
b

【讨论】:

  • 你可能想解释一下这个,它是那些真正不明显的之一。
  • 谢谢@ashwini-chaudhary,请解释一下。我不明白为什么会这样。
  • 在 python 2.7 中似乎不起作用
  • @WenbinWu 添加了一些解释。
【解决方案2】:

您遇到的基本问题与labda表达式的绑定有关,您可以在该方向找到几个问题(例如What is "lambda binding" in Python?Python lambda's binding to local values

一个常见的解决方案是使用functools.partial 来避免该问题:

from __future__ import print_function
import functools

l = ['a', 'b', 'c']
m = {k: functools.partial(print, k) for k in l}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多