如何使用函数将其名称作为值创建一个字典

时间:2012-12-10 21:04:46

标签: python lambda

  

可能重复:
  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'),print('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在这里不起作用。

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

2 个答案:

答案 0 :(得分:3)

您获得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

答案 1 :(得分: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}