2012-12-10 9 views
3

可能重複:
What’s going on with the lambda expression in this python function?
What do (lambda) function closures capture in Python?如何創建一個字典,打印自己的名字作爲價值功能

例如,我有串[ '一' 的名單, 'b','c']。

我想生成一個字典,其中包含該列表中的元素('a','b'和'c')作爲鍵,以及將該鍵打印爲值的函數(print('a'))打印('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 

我知道,如果我不使用拉姆達有

m = {k:print(k) for k in l} 

這是沒有問題的。但我想知道爲什麼lambda不能在這裏工作。

任何想法如何解決這個問題?由於

+0

@ josh-lee你是對的。但似乎答案是不同的。 – WenbinWu

回答

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 
+3

你可能想要解釋一下,這是非常不明顯的一個。 –

+0

謝謝@ ashwini-chaudhary,請解釋一下。我不明白爲什麼這會起作用。 – WenbinWu

+0

似乎不能在Python 2.7 – dmytro