可能重复:
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在这里不起作用。
知道如何解决这个问题吗?感谢
答案 0 :(得分:3)
您获得c
作为每个密钥输出的原因是因为c
在迭代中排在最后,因此x
的最终值为c
在这里,您的程序可以扩展如下:
for x in lis:
def func():
print(x)
dic[x]=func
这里你的函数实际上是访问全局变量x
的值,而不是局部变量。并且在迭代结束时x
为c
,您会得到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}