Поведение dict.get и dict.setdefault в Python
@python_quizРазберем этот квиз
Коротко: dict.get возвращает значение по ключу или default, не изменяя словарь; dict.setdefault возвращает значение по ключу и, если ключа нет — вставляет default в словарь и возвращает его.
Ниже — исходный фрагмент и то, что он выведет, с объяснением.

Ожидаемый вывод:

Разбор по шагам
- d = {'X': '1'} — создаём словарь с одним ключом "X".
- d.get('Y', 0) — поскольку ключа "Y" нет, get вернёт переданный default 0, но ничего в словарь не вставит.
- Поэтому в первом вызове print будет: 0 и булево выражение 'Y' in d даст False.
- d.setdefault('Y', 0) — если ключ "Y" отсутствует, setdefault вставляет его в словарь со значением default (0) и возвращает это значение.
- После вызова setdefault ключ "Y" появится в d со значением 0, поэтому второй print напечатает 0, True и d['Y'] == 0.
Почему это важно
- get полезен, когда нужно получить значение по ключу без побочного эффекта изменения словаря.
- setdefault удобен, когда нужно гарантированно иметь ключ в словаре с некоторым значением, например для сбора данных по ключам.
Подводные камни и рекомендации
- Если default — изменяемый объект (список, словарь и т. п.), setdefault вставит этот объект, и он будет общим для всех использований:

- Часто безопаснее использовать выражение с созданием нового объекта внутри setdefault:

Но будьте внимательны: если default создаётся в аргументе (например, default=[]), он всё равно создаётся один раз в момент вызова, поэтому не стоит писать такой код глобально для разных вызовов.
- Если нужно просто получить значение по ключу или установить его в одну строку без побочных эффектов в других потоках, можно явно проверять наличие ключа или использовать конструкцию:

Однако setdefault короче, когда нужна именно вставка при отсутствии.
Краткий вывод
- get возвращает default без изменения словаря.
- setdefault при отсутствии ключа вставляет default в словарь и возвращает его.