这个问题在这里已经有了答案:




8年前关闭。






例如,我有一个字符串列表 ['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 在这里不起作用。

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

最佳答案

你得到 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

关于python - 如何创建一本带有将其名称打印为值的函数的字典,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13809218/

10-12 19:32