评估python lambda函数列表仅评估最后一个列表元素

时间:2011-05-19 13:13:12

标签: python

我有一个我要按顺序评估的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.

我认为只有最后一个被执行,而不是其他人。有任何想法吗?谢谢!

3 个答案:

答案 0 :(得分:18)

lambda正在查找'i'的全局值。

请尝试以下方法:

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

答案 1 :(得分:2)

尝试使用partial,对我有用:

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

答案 2 :(得分:1)

不是Python专家,但是Python可能会在

中处理i
lst.append(lambda x: f(x,i))

作为参考?然后,在循环之后,i等于其最后指定的值(4),并且当调用函数时,它们遵循其i引用,找到4,并使用该值执行。

披露:可能是废话。