TGViewer
Python вопросы с собеседований Python вопросы с собеседований @python_job_interview · 24.9K subscribers
Post #1135 6.32K
🐍 Хитрая задача для опытных Python-разработчиков
Почему этот код не работает как ожидается?


def magic():
return [lambda: i for i in range(5)]

funcs = magic()
results = [f() for f in funcs]
print(results)

На первый взгляд, ты ожидаешь результат:


[0, 1, 2, 3, 4]

Но на деле вывод будет:


[4, 4, 4, 4, 4]

🔍 Что пошло не так

lambda: i не захватывает значение i, а замыкается на саму переменную i, которая одна и та же для всех лямбд.
К моменту вызова всех функций i = 4 (последнее значение цикла), и все лямбды возвращают одно и то же.

Это классический пример late binding — лямбда "вспоминает" переменную, а не её значение в момент создания.

✅ Как исправить

Способ 1: фиксируем значение i через аргумент по умолчанию


def magic():
return [lambda i=i: i for i in range(5)]

funcs = magic()
results = [f() for f in funcs]
print(results)


Теперь вывод:


[0, 1, 2, 3, 4]


Способ 2: functools.partial


from functools import partial

def f(x): return x
funcs = [partial(f, i) for i in range(5)]
results = [f() for f in funcs]
print(results)


🧠 Почему это важно

Такие баги встречаются:

- в колбэках и ивентах (например, при работе с GUI или CLI)

- в генерации функций внутри циклов
- в async-замыканиях и DSL-интерпретаторах
- в тестовых фреймворках, где создаются сценарии динамически

Понимание области видимости, замыканий и позднего связывания (late binding) — необходимый навык для confident-сеньора.

@python_interview
  • ❤ 11
  • 👍 7
  • 🔥 1
  • 🥰 1
  • 👏 1
More from @python_job_interview
  1. Sep 23, 2026Визуализация данных на Python: 10 лучших примеров с кодом Визуализация данных на Python -…
  2. Sep 22, 2026Как правильно получить случайное число в Python Если нужен диапазон от 1 до 100 включитель…
  3. Sep 19, 2026✔️ Кто подключился к вашей сети? NetAlertX обнаруживает устройства и уведомляет об изменен…
  4. Sep 18, 2026✔️ QuiverAI выпустила обновление генератора векторной графики Во второе поколение семейств…
  5. Sep 17, 2026📚 Бесплатная книга по математике для Computer Science и Machine Learning - более 2200 стр…
  6. Sep 15, 2026🐍 Python: как найти изменённое поле во вложенном словаре Сравнение before == after покаже…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →