Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.
Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.
3 046 подписчиков · @BookPython
К каналу →
📌 Декораторы в Python: как они работают и зачем нужны? Сегодня я покажу вам, как работают декораторы в Python и зачем они вообще нужны. Декораторы позволяют изменять поведение фу…
Читать далее →
6 455
Реклама
Профилируем Python в продакшене: почему cProfile не подходит, и чем хорош py-spy Когда на проде начинает течь память или скачет CPU, первая мысль, подключить профайлер. Стандартны…
Читать далее →
6 492

Ловушка замыканий: Почему ваши лямбды в цикле сломаны (Late Binding)

Ловушка замыканий: Почему ваши лямбды в цикле сломаны (Late Binding)

Вы пишете код, который генерирует список функций (например, колбэки для кнопок в UI или динамические фильтры). Кажется, что все логично, но на выходе получаете сюрприз.

Проблемный код:

# Хотим создать 3 функции, которые возвращают 0, 1 и 2 соответственно
funcs = []
for i in range(3):
funcs.append(lambda: i)

# Проверяем
results = [f() for f in funcs]
print(results)
# Ожидание: [0, 1, 2]
# Реальность: [2, 2, 2]

Почему так происходит?
Это называется Late Binding (позднее связывание).
В Python замыкания (closures) захватывают переменные по ссылке, а не по значению.
Когда вы объявляете lambda: i, Python не сохраняет текущее число 0, 1 или 2. Он сохраняет инструкцию: «когда меня вызовут, пойди в локальную область видимости, найди переменную с именем i и возьми ее значение».

К моменту, когда вы начинаете вызывать функции из списка results, цикл for уже завершился. Переменная i в этой области видимости навсегда осталась равной 2. Все три лямбды смотрят на одну и ту же переменную i.

Как лечить?

Есть два каноничных способа заставить Python запомнить значение «здесь и сейчас».

1. Аргумент по умолчанию (Hack way)
Значения аргументов по умолчанию вычисляются в момент определения функции.

funcs = []
for i in range(3):
# i=i создает локальную переменную i внутри функции
# и присваивает ей текущее значение i из цикла
funcs.append(lambda i=i: i)

Это работает быстро, но выглядит немного грязно и может сбить с толку линтеры или коллег.

2. functools.partial (Enterprise way)
Более чистый и явный способ. partial создает новый callable-объект, «замораживая» переданные аргументы.

from functools import partial

funcs = []
for i in range(3):
# Здесь значение i фиксируется жестко
funcs.append(partial(lambda x: x, i))

Где это стреляет в реальной жизни?

- Генерация command для кнопок в Tkinter/PyQt.
- Динамическое создание task в asyncio циклах.
- Патчинг тестов в циклах.

Не дайте переменным пережить свое время.

#python #internals #functionalprogramming #gotchas

👉 @BookPython
⚡ Как ускорить код на Python? Используем map, filter, reduce ⚡ Привет, друзья! Сегодня расскажу о том, как можно ускорить выполнение кода, заменяя обычные циклы на встроенные функ…
Читать далее →
6 649
Pytest Patterns: Элегантный Teardown через yield и оптимизация скоупов Если вы все еще пишете def teardown_method(self): в классах тестов, вы не используете мощь Pytest на 100%. Ф…
Читать далее →
6 793
Другие главы канала «Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.»
Выберите главу, чтобы продолжить чтение
Все посты →
Глава от 30.06.2026
Сравнение производительности dict() и {} в Python Какое-то время назад, во врем…
👁 460 просмотров
Глава от 28.06.2026
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 ht…
👁 432 просмотров
Глава от 26.06.2026
Когда вы пишете собственный метод __repr__ для какого-то объекта, обычно нужно в…
👁 634 просмотров
Глава от 25.06.2026
Модуль functools для манипуляций с функциями Модуль functools в Python предоста…
👁 618 просмотров
Глава от 23.06.2026
Генератор можно остановить. Ты можешь явно вызвать g.close(), но обычно это дела…
👁 687 просмотров
Глава от 22.06.2026
Стандартный модуль json имеет интерфейс командной строки, который может быть пол…
👁 809 просмотров
Глава от 21.06.2026
Все объекты в Python создаются с помощью вызова метода __new__. Даже если вы опр…
👁 837 просмотров
Глава от 20.06.2026
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 ht…
👁 750 просмотров
Глава от 18.06.2026
Python позволяет перегружать многие разные операторы, и оператор сдвига — один и…
👁 933 просмотров

Популярные посты канала «Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.»

Как упростить работу с аргументами в командной строке с помощью typer Раньше для CLI-приложений на Python я использовал argparse, потом был…
👁 8 025 просмотров
Создание объекта в Python включает два ключевых этапа. Сначала вызывается метод __new__, который создаёт и возвращает новый объект. Затем вы…
👁 8 023 просмотров
🚀 Как логировать без боли в Python Как настроить логирование в Python один раз — и больше к этому не возвращаться. Обычно начинающие разра…
👁 7 991 просмотров
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https…
👁 7 983 просмотров
💡 Как избежать повторения кода с помощью functools.partial Как упростить код и избежать дублирования с помощью functools.partial. Допустим…
👁 7 971 просмотров
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https…
👁 7 941 просмотров
В Python оператор квадратных скобок [] можно переопределить, реализовав магический метод __getitem__. Это позволяет, например, создать объек…
👁 7 919 просмотров
Популярный способ объявить абстрактный метод в Python — это выбросить исключение NotImplementedError: def human_name(self): raise NotIm…
👁 7 841 просмотров
Встроенные значения float в Python используют оборудование вашего компьютера напрямую, поэтому любое значение представляется внутренне в вид…
👁 7 817 просмотров
Иногда в программе нужна очередь — контейнер, куда элементы добавляются с одной стороны и извлекаются с другой. В Python для этого можно исп…
👁 7 805 просмотров
Существует два понятия с похожими названиями, которые легко перепутать: переопределение (overriding) и перегрузка (overloading). Переопреде…
👁 7 770 просмотров
Иногда возникает необходимость выполнить участок кода и проигнорировать все возможные исключения. Это оправдано в случае с плагинами, сторон…
👁 7 752 просмотров
⚠️ Можно знать алгоритмы машинного обучения и всё равно получать плохие результаты. Большинство проблем моделей начинаются с некачественной …
👁 7 743 просмотров
Есть три ситуации, в которых только что созданную переменную нельзя аннотировать типом: распаковка кортежей, циклы for и инструкции with. В…
👁 7 701 просмотров
В Python имя переменной может состоять из одного символа подчёркивания: _. Хотя такие имена обычно недостаточно описательны и их не стоит ис…
👁 7 697 просмотров
Некоторый код может выводить интересующие вас данные в stdout, вместо того чтобы предоставлять API, возвращающий строку, пригодную для испол…
👁 7 656 просмотров
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https…
👁 7 624 просмотров
Скрытые фичи Enum: как выжать максимум Многие используют Enum как простой список констант. Но у enum.Enum в Python есть куда больше возможн…
👁 7 620 просмотров
Обычно вы взаимодействуете с генератором, запрашивая данные с помощью next(gen). В Python 3 вы также можете отправлять значения обратно в ге…
👁 7 605 просмотров
Чтобы отсортировать словарь по его значениям, используйте функцию sorted с пользовательской функцией ключа: >>> d = dict(a=1, c=3, b=2) >>>…
👁 7 574 просмотров

Связанные темы в других каналах

Каналы из той же тематики, где часто появляются близкие сюжеты
Вся тема →
@canalmaxone
AntiCloudMod
AntiCloudMod — сообщество для тех, кто ценит свободу общения без облачной цензуры. Здесь обсуждают альтернативные мессенджеры, инструменты для приватности и децентрализов…
👥 423 646 · -7 236/7д
@BelgorodDRONE
Информация БПЛА Белгород, Белгородский район
Информация БПЛА Белгород, Белгородский район — специализированный канал в мессенджере Макс, посвященный новостям и информации о беспилотных летательных аппаратах в регион…
👥 184 699 · +6 719/7д
@WylsacomRed
Wylsacom Red
Официальный канал Wylsacom в Max. Тут всё про технологии и жизнь в ногу со временем! Номер заявления для регистрации в РКН: № 6979154178 Розыгрыши: kichaev@wylsacom.med…
👥 161 614 · +845/7д
@biologia89
РОБЛОКС🔷
РОБЛОКС В МАКС! Наш чат: https://max.ru/join/-yBHh5DSEb-WQ8DjAedoLB1fpgDOvQlWpS4PJ7Wqeb8 Реклама: https://clck.ru/3Tmmgx
👥 126 972 · +12 229/7д
@TikTokModCloud
TikTokModCloud
Официальные обновления стабильного мода TikTok Чат: https://clck.ru/3S6mVh По рекламе: https://iimax.ru/dim4ugan
👥 102 028 · +1 700/7д
@na_kruchok
ГЛЕНТ | МЕМЫ
Глент мемы Это фан-сообщество, созданное преданными поклонниками для поддержки творчества Глента. Данный канал НЕ является официальным и ведется фанатом Биржа: telega.…
👥 78 032 · +225/7д
🏷 Темы и теги
#python #internals #functionalprogramming #gotchas #telegram bots #django #fastapi #парсинг #selenium #Технологии
📋 О канале Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.
Учим язык Python на практике. Создание веб-приложений: Django, Flask, FastAPI. Пишем ботов для Телеграм на Aiogram. Парсинг сайтов (Web Scraping): Selenium, BeautifulSoup (BS4), Scrapy. Работа с базами данных (PostgreSQL, Redis, SQL) и API. Асинхронное программирование (Asyncio). Настройка Docker, Git и Linux. Алгоритмы, задачи с собеседований и Roadmap для Junior Python Developer.
🔍 Архив всех постов Макс
Поиск по 14,325,125 постам из 202,587 каналов
Подключить за 490 ₽/мес →
Удалить пост или канал с МАКСОТЕКИ
Заявка подтверждается через бота Макс: нужно быть администратором канала и добавить бота МАКСОТЕКИ в администраторы. После проверки канал или конкретный пост скрывается с сайта.
📊 Аналитика канала «Python Разработка | Web Backend, Парсинг & Telegram Bots. Пайтон программирование с нуля. Django, FastAPI и SQL. Уроки для начинающих и IT карьера. Coding.» ➡️ Перейти в канал Макс
Заявка в МАКСОТЕКА
Добавьте свой канал в каталог
Зарегистрируйтесь в личном кабинете и добавьте канал за пару кликов.
Перейти в личный кабинет →

Бесплатная регистрация, быстрая модерация.