i
относится к одной и той же переменной каждый раз, поэтому i
равно 9 во всех лямбдах, потому что это значение i
в конце цикла. Самый простой обходной путь включает в себя аргумент по умолчанию:
lambda x, i=i: x+i
Это связывает значение i
цикла с локальной переменной i
во время определения лямбды.
Другой обходной путь - определить лямбду, определяющую другую лямбду, и вызвать первую лямбду:
(lambda i: lambda x: x+i)(i)
Такое поведение имеет немного больше смысла, если учесть это:
def outerfunc():
def innerfunc():
return x+i
a = []
for i in range(10):
a.append(innerfunc)
return a
Здесь innerfunc
определяется один раз, поэтому интуитивно понятно, что вы работаете только с одним функциональным объектом, и вы не ожидаете, что цикл создаст десять различных замыканий. С лямбдой это не выглядит как функция, определенная только один раз, похоже, что вы определяете ее заново каждый раз в цикле, но на самом деле она функционально совпадает с длинной версией .