3

可能重复:
这个 python 函数中的 lambda 表达式是怎么回事?
(lambda) 函数闭包在 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 在这里不起作用。

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

4

2 回答 2

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
于 2012-12-10T21:07:29.487 回答
2

您遇到的基本问题与 labda 表达式的绑定有关,您可以在该方向找到几个问题(例如Python 中的“lambda 绑定”是什么?Python lambda 与本地值的绑定

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

from __future__ import print_function
import functools

l = ['a', 'b', 'c']
m = {k: functools.partial(print, k) for k in l}
于 2012-12-10T21:15:49.233 回答