Как вернуть функцию, использующую значение переменной?
Я хочу написать функцию, которая возвращает список функций. Как MWE, здесь моя попытка функции, которая дает три функции, которые добавляют 0, 1 и 2 к входному числу:
def foo():
result = []
for i in range(3):
temp = lambda x: x + i
print(temp(42)) # prints 42, 43, 44
result.append(temp)
return result
for f in foo():
print(f(42)) #prints 44, 44, 44
В отличие от моего ожидания, каждая функция заканчивается использованием последнего значения, полученного i. Я испытал подобное поведение, когда, например, список используется как аргумент функции, но Python фактически использует указатель на список, но здесь я является целым числом, поэтому я не понимаю, что происходит здесь. Я запускаю Python 3.5.
Ответы
Ответ 1
Замыкания связывают последнее, то есть они будут использовать последнее значение i
в области, которую они определили при вызове (в этом случае последнее значение i
будет 2
).
Общим решением для этого является значение i
в качестве аргумента по умолчанию:
temp = lambda x, i=i: x + i
Поскольку Python оценивает аргументы по умолчанию во время построения функции, это трюк, который помогает Python использовать правильное значение i
при вызове вызываемого, он не создает замыкание и, вместо этого, может выглядеть i
вверх в нем locals.