簡體   English   中英

評估 Python lambda 函數列表僅評估最后一個列表元素

[英]Evaluating a list of python lambda functions only evaluates the last list element

我有一個要按順序評估的 lambda 函數列表。 我不知道為什么,但只有最后一個函數被評估。 下面的例子:

  >>> def f(x,z):
  ...     print "x=",x,", z=",z
  ... 
  >>> 
  >>> g = lambda x : f(x,13)
  >>> g(2)
  x= 2 , z= 13    # As expected
  >>> 
  >>> lst=[]
  >>> 
  >>> for i in range(0,5): 
  ...    lst.append(lambda x: f(x,i))
  ... 
  >>> print lst
  [<function <lambda> at 0x10341e2a8>, <function <lambda> at 0x10341e398>, <function <lambda> at 0x10341e410>, <function <lambda> at 0x10341e488>, <function <lambda> at 0x10341e500>]
  >>> 
  >>> for fn in lst:
  ...   fn(3)
  ... 
  x= 3 , z= 4 # z should be 0
  x= 3 , z= 4 # z should be 1
  x= 3 , z= 4 # z should be 2
  x= 3 , z= 4 # z should be 3
  x= 3 , z= 4 # as expected.

我認為只有最后一個被執行,其他的沒有。 有任何想法嗎? 謝謝!

lambda 只是查找 'i' 的全局值。

請嘗試以下操作:

for i in range(0,5):
  lst.append(lambda x, z=i: f(x,z))

嘗試使用部分,對我有用:

from functools import partial

def f(x,z):
    print "x=",x,", z=",z

lst = [ partial(f,z=i) for i in range(5) ]

for fn in lst:
    fn(3)

http://docs.python.org/library/functools.html#functools.partial

不是 Python 專家,但 Python 是否可能正在處理i

lst.append(lambda x: f(x,i))

作為參考? 然后,在循環之后, i等於其最后分配的值 (4),並且當函數被調用時,它們遵循它們的i引用,找到 4,並使用該值執行。

披露:可能是胡說八道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM