TGViewer
Python: задачки и вопросы Python: задачки и вопросы @quiz_python · 6.93K subscribers
Post #4491 801
Главный подвох: Python использует late binding в замыканиях — переменные захватываются по ссылке, и их значение берётся в момент вызова функции, а не в момент создания.​

Разбор по шагам в псевдо‑записи:

1️⃣Создание списка функций:
𝚏𝚞𝚗𝚌𝚜 =
𝚏𝚘𝚛 𝚒 𝚒𝚗 𝚛𝚊𝚗𝚐𝚎(𝟸):
▸ 𝚏𝚞𝚗𝚌𝚜.𝚊𝚙𝚙𝚎𝚗𝚍(𝚕𝚊𝚖𝚋𝚍𝚊 𝚡: 𝚡 * 𝚒)
— создаётся три лямбды, каждая ссылается на переменную i из внешнего scope.
— переменная i меняется: 0 → 1 → 2.​

2️⃣Момент вызова функций:
Когда выполняется [f(1) for f in funcs], цикл for i in range(3) уже завершился.​
Переменная i в глобальном scope теперь равна 2 (последнее значение).​

3️⃣Выполнение каждой лямбды:
Первый вызов: funcs[0](1) → lambda x: x * i, где i = 2 → 1 * 2 = 2.​
Второй вызов: funcs[1](1) → та же лямбда, та же ссылка на i, i = 2 → 1 * 2 = 2.​
Третий вызов: funcs[2](1) → опять i = 2 → 1 * 2 = 2.​

4️⃣Результат: [2, 2, 2].​

Чтобы каждая лямбда «запомнила» своё значение i, нужно захватить его через default argument:

funcs = [lambda x, i=i: x * i for i in range(3)]
print([f(1) for f in funcs]) # [0, 1, 2]

Здесь i=i создаёт локальную переменную внутри лямбды с значением на момент создания, а не ссылкой на внешнюю переменную.​

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

🔘Late binding — частая причина ошибок в циклах с lambda, list comprehension и callback‑функциями.​
🔘Правило: если нужно захватить переменную из цикла, всегда используйте default argument для lambda или локальную переменную внутри comprehension.​
🔘Это поведение отличается от некоторых других языков, где захват происходит по значению по умолчанию.
  • 🔥 7
More from @quiz_python
  1. Sep 22, 2026Развёрнутое пояснение: 1. Вызов build_batch создаёт генератор, но его тело пока не исполня…
  2. Sep 22, 2026Post #4884
  3. Sep 22, 2026Развёрнутое пояснение: 1. Вызывается load_config, управление переходит в блок try. 2. Перв…
  4. Sep 22, 2026Post #4882
  5. Sep 21, 2026Развёрнутое пояснение: 1. make_handlers создаёт пустой список handlers. 2. Цикл дважды при…
  6. Sep 21, 2026Post #4880
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 →