Подтвердить что ты не робот

Оценка списка лямбда-функций python оценивает только последний элемент списка

У меня есть список лямбда-функций, которые я хочу оценить по порядку. Я не уверен, почему, но оценивается только последняя функция. Пример ниже:

  >>> 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.

Я думаю, что только последний получает исполнение, но не остальные. Есть идеи? Спасибо!

4b9b3361

Ответ 1

Лямбда просто ищет глобальное значение "i".

Попробуйте вместо этого:

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

Ответ 3

Не эксперт Python, но возможно ли, что Python обрабатывает i в

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

как ссылка? Затем, после цикла, i равен его последнему присвоенному значению (4), а когда вызываются функции, они следуют за их ссылкой i, находят 4 и выполняют с этим значением.

Раскрытие информации: возможно, вздор.