Выбор ответа Middle Функции и области видимости спрашивают часто обновлено
Лямбды в цикле и позднее связывание
Вопрос
Что выведет код?
fs = [lambda: i for i in range(3)]
print([f() for f in fs])
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: [2, 2, 2]. Каждая лямбда замыкает переменную i, а не её значение в момент создания.
Варианты ответа
[2, 2, 2]правильный ответ[0, 1, 2][0, 0, 0]NameError
Разбор
Каждая лямбда замыкает переменную i, а не её значение в момент создания. Вызываются они после цикла, когда i уже 2. Переменная comprehension живёт в своей области, но эта область общая для всех лямбд, поэтому NameError нет. Исправление: lambda i=i: i, значение по умолчанию вычислится сразу.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Распаковка ** и повторяющийся аргумент
Следующий вопрос
Изменяемое значение по умолчанию
Термины по теме
Ещё по теме «Функции и области видимости»
- Что такое *args и **kwargs
- Перекрытие встроенных имён
- Как передаются аргументы в функцию Python
- Где хранятся переменные замыкания
- Вызов с *args и **kwargs: разбор сигнатуры
- Композиция функций
- Мемоизация через замыкание
- Повтор вызова с ограничением попыток