Разбор поведения лямбда-функций в Python
@python_quizРазберем этот квиз, в котором нам предложено понять поведение лямбда-функций в Python. Рассмотрим следующий код:
funcs = [lambda x: x + i for i in range(3)]
for f in funcs:
print(f(0))Что происходит в коде?
В этом фрагменте кода мы создаем список лямбда-функций, используя генератор. Каждая лямбда-функция добавляет к своему аргументу x значение переменной i, которая изменяется в цикле for.
Анализ переменной i
На первый взгляд может показаться, что каждая функция запоминает свое собственное значение i, но это не так. Все лямбда-функции ссылаются на одну и ту же переменную i. В итоге, когда цикл завершится, значение i будет равно 2 (последнему значению в range(3)).
Выполнение лямбда-функций
Теперь, когда мы вызываем каждую из этих функций с аргументом 0, они будут добавлять к нему значение i, которое равно 2:
print(f(0)) # f(0) = 0 + 2
Таким образом, результатом каждого вызова будет:
2
Возможные варианты ответов
В квизе нам предложены следующие варианты ответов:
- 0, 1, 2
- 3, 4, 7
- 0, 0, 0
- 2, 2, 2
Правильный ответ
Как мы выяснили, все функции возвращают 2, следовательно, правильный ответ — 2, 2, 2 (индекс 3 в options).
Заключение
Этот пример наглядно демонстрирует, как важно понимать область видимости переменных в Python. Лямбда-функции не создают собственные копии переменных из окружающего контекста, а ссылаются на них. Это может привести к неожиданным результатам, если не учитывать, как работает область видимости.
Используйте этот случай как урок, чтобы лучше понимать, как работают функции и замыкания в Python!