TGViewer
Python вопросы с собеседований Python вопросы с собеседований @python_job_interview · 24.9K subscribers
Post #1224 2.69K
🎯 Разбор задания с подвохом (Python, собес)

Задание
> Сформируйте список функций callbacks, где каждая функция при вызове печатает свой индекс.
> Затем вызовите их по очереди (или из потоков/таймеров) — ожидаемый вывод: 0 1 2.

Наивное решение (почти все так пишут)

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

for f in callbacks:
f()


Что выведет?
2 2 2 — и это не баг интерпретатора.

В чём подвох

- Замыкание поздно связывает имя i: лямбды не «копируют» значение, а смотрят на переменную i, когда вы их вызываете.
- К моменту вызова цикл уже закончился, i == 2, значит все три лямбды печатают 2.

Правильные варианты

Привязать значение через параметр по умолчанию (часто лучший баланс читаемости)


callbacks = [lambda i=i: print(i) for i in range(3)]
for f in callbacks:
f() # 0 1 2

Заводим фабрику функций (прямо подчёркивает намерение)


def make_printer(i):
def _f():
print(i)
return _f

callbacks = [make_printer(i) for i in range(3)]
for f in callbacks:
f() # 0 1 2

functools.partial — когда нужно просто «прикрутить аргументы»


from functools import partial

callbacks = [partial(print, i) for i in range(3)]
for f in callbacks:
f() # 0 1 2

А если таймеры/потоки?


import threading

for i in range(3):
# ПЛОХО: замкнёт одно и то же i
# threading.Timer(1, lambda: print(i)).start()

# ХОРОШО: привяжем значение сразу
threading.Timer(1, lambda i=i: print(i)).start()


Мини-чеклист для собеса

- Лямбды/внутренние функции в цикле → проверь, не упираешься ли в late binding.

- Если нужна «заморозка» значения, используй параметр по умолчанию, фабрику или partial.

Не путай с другой классикой: изменяемые значения по умолчанию (например, def f(x, acc=[])), это другая ловушка.

Вывод

В Python замыкания захватывают имена, а не значения.

Привязывай нужное значение в момент создания функции — и подвох исчезнет.
  • 👍 9
  • 🔥 6
  • ❤ 5
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 →