Веб-версияОткрыть в Telegram

Пост🐍 Хитрая задача для опытных Python-разработчиков

25 июня 2025
P
Python Скрипты
🐍 Хитрая задача для опытных 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
6 · 2.5K ·

Рядом в ленте

PPython Скрипты⚡️ Скрипт анализ файлов python 🖥 ЯП: Python 3.11+🐍 💾 Модули: ast,sys,os, collections 📂 База данных: - 💡 Скрипт, позволяющий анализировать ваш файл python. Он прPPython Скрипты📌 Менеджер паролей 👨‍💻 import csv from cryptography.fernet import Fernet passwords = [] key = Fernet.generate_key() cipher_suite = Fernet(key) def encrypt_passw
это сообщение
PPython Скрипты🖥 Хитрый способ изменить поведение цикла for — без изменения самого цикла Можно ли сделать так, чтобы весь Python-код, использующий for x in ..., внезапно началPPython Скрипты⚡ Microsoft выкатили **amplifier** - новую экспериментальную платформу для сборки AI-инструментов без лишнего кода. Что это: - способ описать экспертный процесс
PPython СкриптыPython Скрипты@Pythonscriptss · канал · Технологии
2 899подписчиков37постов в индексе
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем