Списки, кортежи, словари и множества: 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 枚のスライドが完全版にはさらにあります。
ログインして購読すると、動画、全スライド、ノート、テスト、AIチューター、面接が利用できます。
ログインまたは新規登録 サブスクリプションに登録レッスンの内容
- Функция «поправила» конфиг — и отчёт поехал
- Список: упорядоченный и изменяемый
- Два имени — один список
- Кортеж: запись, которую не перепишешь
- Словарь: найти по ключу мгновенно
- Множество: только уникальное
- Шпаргалка: какую коллекцию брать
- Что нового: 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文字列
- 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 и итоговый проект