Списки, кортежи, словари и множества: frozendict в Python 3.15
Четыре главные коллекции Python и когда какую брать. Для опытных: встроенный frozendict (PEP 814), Counter с оператором ^, itertools.batched (3.12).
- Выбирать подходящую коллекцию
- Защищать конфиг от случайной правки через frozendict
- Копировать с изменениями через оператор |
بداية الدرس
Функция «поправила» конфиг — и отчёт поехал
- Обычный dict передаётся в функцию по ссылке
- Любая функция может его изменить
- В 3.15: frozendict — изменение вызывает TypeError
Реальная история из любого проекта с данными. Есть общий словарь настроек: минимальная и максимальная сумма траты. Кто-то пишет функцию очистки выбросов и прямо внутри неё меняет максимум на тысячу — задумывалось как локальная правка. А словарь-то общий. Все следующие расчёты молча используют чужой порог, и отчёт за месяц расходится с банком. Ошибки нет, предупреждения нет. Сегодня разберёмся, почему так происходит и как 3.15 это запрещает.
config = {"min_amount": 0, "max_amount": 500}
def drop_outliers(cfg):
cfg["max_amount"] = 1000 # "локальная" правка
drop_outliers(config)
print(config) # конфиг изменился молча
Список: упорядоченный и изменяемый
- Создание: [] или list()
- .append(x), .insert(i, x), .pop(), .remove(x)
- sorted(x) — новая копия, x.sort() — на месте
Список — самая ходовая коллекция. Это упорядоченный набор любых значений в квадратных скобках, и его можно менять: добавлять в конец, вставлять в середину, удалять. Порядок сохраняется ровно таким, каким вы его задали. Отдельно обратите внимание на сортировку: функция sorted возвращает новый отсортированный список, а метод sort переставляет элементы в самом списке и ничего не возвращает. Путаница между ними — частая причина «почему у меня None».
amounts = [250, 1200, 99]
amounts.append(450) # добавили в конец
print(sorted(amounts)) # новая копия
print(amounts) # исходный порядок цел
result = amounts.sort() # сортирует на месте
print(result, amounts) # None и уже отсортированный
Два имени — один список
- b = a не копирует список, а вешает второй ярлык
- Копия: a.copy(), list(a) или a[:]
- Вложенные данные: copy.deepcopy(a)
Помните метафору ярлыков из второй лекции? Здесь она начинает работать. Когда вы пишете «бэ равно а», Python не копирует список, а вешает на тот же самый список второй ярлык. Меняете через одно имя — изменения видны через другое. Ровно это и случилось с конфигом в начале лекции: функция получила не копию, а ярлык на общий словарь. Если нужна независимая копия, её надо сделать явно.
الدرس الكامل متاح بالاشتراك
و9 شريحة أخرى في النسخة الكاملة.
تُفتح الفيديو وجميع الشرائح والملاحظات والاختبارات والمرشد الذكي والمقابلة بعد تسجيل الدخول والاشتراك.
تسجيل الدخول أو إنشاء حساب الاشتراك الآنمحتوى الدرس
- Функция «поправила» конфиг — и отчёт поехал
- Список: упорядоченный и изменяемый
- Два имени — один список
- Кортеж: запись, которую не перепишешь
- Словарь: найти по ключу мгновенно
- Множество: только уникальное
- Шпаргалка: какую коллекцию брать
- Что нового: frozendict встроен в язык (3.15, PEP 814)
- frozendict: копия с изменениями через |
- Грабли: isinstance(cfg, dict) вернёт False
- Что нового: batched и Counter ^
- Итог: траты в списке, итоги в словаре, конфиг заморожен
مقالات حول هذا الدرس
- القواميس في Python (dict): الإنشاء والطرق والتكرار والترتيب وfrozendict
- القوائم في Python (list): الطرق والشرائح والترتيب وappend والصفوف والمجموعات
- كيفية تحميل Python وتثبيته على Windows وmacOS وLinux: خطوات بالتفصيل
- النصوص في Python: split وreplace وstrip وjoin والشرائح وf-strings
- الوحدات والحزم في Python: import وpip وvenv والمكتبات بكلمات بسيطة
جميع دروس هذه الدورة
- Python 3.15 с нуля и для опытных: что нового и как учить
- Python 3.15: установка, REPL и первый скрипт за десять минут
- Переменные, числа и строки в Python: f-строки и t-строки
- Условия, циклы и match/case в Python: управляем ходом программы
- Списки, кортежи, словари и множества: frozendict в Python 3.15
- Comprehensions в Python: распаковка * и ** внутри (PEP 798)
- Функции и аннотации типов в Python: от def до sentinel
- Ошибки и исключения в Python 3.15: читаем трейсбек и подсказки «Did you mean»
- Модули, пакеты и ленивые импорты в Python 3.15 (PEP 810)
- Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию
- Классы и dataclasses в Python: ООП без лишнего кода
- Асинхронность и потоки в Python: asyncio, TaskGroup и free-threading
- Профилирование Python 3.15: Tachyon вместо cProfile и итоговый проект