पाठ का अंश

Списки, кортежи, словари и множества: frozendict в Python 3.15

Четыре главные коллекции Python и когда какую брать. Для опытных: встроенный frozendict (PEP 814), Counter с оператором ^, itertools.batched (3.12).

list tuple dict set frozendict
इस पाठ में आप क्या सीखेंगे
  • Выбирать подходящую коллекцию
  • Защищать конфиг от случайной правки через 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 ट्यूटर और इंटरव्यू लॉगिन करने और सदस्यता लेने के बाद खुलेंगे।

लॉग इन या रजिस्टर करें सदस्यता लें

पाठ की सामग्री सूची

  1. Функция «поправила» конфиг — и отчёт поехал
  2. Список: упорядоченный и изменяемый
  3. Два имени — один список
  4. Кортеж: запись, которую не перепишешь
  5. Словарь: найти по ключу мгновенно
  6. Множество: только уникальное
  7. Шпаргалка: какую коллекцию брать
  8. Что нового: frozendict встроен в язык (3.15, PEP 814)
  9. frozendict: копия с изменениями через |
  10. Грабли: isinstance(cfg, dict) вернёт False
  11. Что нового: batched и Counter ^
  12. Итог: траты в списке, итоги в словаре, конфиг заморожен

इस व्याख्यान से जुड़े लेख

इस कोर्स के सभी पाठ

  1. Python 3.15 с нуля и для опытных: что нового и как учить
  2. Python 3.15: установка, REPL и первый скрипт за десять минут
  3. Переменные, числа и строки в Python: f-строки и t-строки
  4. Условия, циклы и match/case в Python: управляем ходом программы
  5. Списки, кортежи, словари и множества: frozendict в Python 3.15
  6. Comprehensions в Python: распаковка * и ** внутри (PEP 798)
  7. Функции и аннотации типов в Python: от def до sentinel
  8. Ошибки и исключения в Python 3.15: читаем трейсбек и подсказки «Did you mean»
  9. Модули, пакеты и ленивые импорты в Python 3.15 (PEP 810)
  10. Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию
  11. Классы и dataclasses в Python: ООП без лишнего кода
  12. Асинхронность и потоки в Python: asyncio, TaskGroup и free-threading
  13. Профилирование Python 3.15: Tachyon вместо cProfile и итоговый проект