Ответ 1
Лямбда просто ищет глобальное значение "i".
Попробуйте вместо этого:
for i in range(0,5):
lst.append(lambda x, z=i: f(x,z))
У меня есть список лямбда-функций, которые я хочу оценить по порядку. Я не уверен, почему, но оценивается только последняя функция. Пример ниже:
>>> 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.
Я думаю, что только последний получает исполнение, но не остальные. Есть идеи? Спасибо!
Лямбда просто ищет глобальное значение "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 и выполняют с этим значением.
Раскрытие информации: возможно, вздор.