Как вернуть функцию, использующую значение переменной?

Я хочу написать функцию, которая возвращает список функций. Как 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.