这个问题在这里已经有了答案:
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
的值,而不是局部变量。在迭代结束时 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
关于python - 如何创建一本带有将其名称打印为值的函数的字典,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13809218/