计算python lambda函数的列表只计算最后一个列表元素

计算python lambda函数的列表只计算最后一个列表元素,python,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 >>> >>>

我有一个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.
定义f(x,z): ... 打印“x=,x=,z=,z=,z=” ... >>> >>>g=λx:f(x,13) >>>g(2) x=2,z=13#如预期 >>> >>>lst=[] >>> >>>对于范围(0,5)内的i: ... 附加(λx:f(x,i)) ... >>>打印lst [, , ] >>> >>>对于lst中的fn: ... fn(3) ... x=3,z=4#z应为0 x=3,z=4#z应该是1 x=3,z=4#z应该是2 x=3,z=4#z应该是3 x=3,z=4#如预期。
我想只有最后一个被处决了,其他的都没有。有什么想法吗?谢谢

尝试使用分部,对我有效:

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)

不是Python专家,但Python是否有可能在

lst.append(lambda x: f(x,i))
作为参考?然后,在循环之后,
i
等于其最后分配的值(4),当调用函数时,它们遵循其
i
引用,找到4,并使用该值执行


披露:可能是胡说八道。

lambda只是在查找“i”的全局值

请尝试以下操作:

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

可能重复的谢谢!我有一种模糊的感觉,它指的是全局空间中的变量,但我不知道该搜索什么。谢谢!!出于好奇,这个用例是什么?是的!(来自上面Jon Skeet给出的链接)。谢谢你很接近。lambda函数在调用时会查找
i
,并且在全局范围内
i
等于4,因为这是它在循环中设置的最后一个值。我从未使用过这个值,下面由bluepnume编写的post看起来更容易使用。干杯实际上这是一个很好的解决方案。在这种情况下使用partials很有意义。谢谢;)我个人也更喜欢列表理解而不是for/append方法