Выбор ответа Middle Функции и области видимости спрашивают часто обновлено

Лямбды в цикле и позднее связывание

Вопрос

Что выведет код?

fs = [lambda: i for i in range(3)]
print([f() for f in fs])

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: [2, 2, 2]. Каждая лямбда замыкает переменную i, а не её значение в момент создания.

Варианты ответа

  1. [2, 2, 2]правильный ответ
  2. [0, 1, 2]
  3. [0, 0, 0]
  4. NameError

Разбор

Каждая лямбда замыкает переменную i, а не её значение в момент создания. Вызываются они после цикла, когда i уже 2. Переменная comprehension живёт в своей области, но эта область общая для всех лямбд, поэтому NameError нет. Исправление: lambda i=i: i, значение по умолчанию вычислится сразу.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.