Поведение dict.get и dict.setdefault в Python

Поведение dict.get и dict.setdefault в Python

@python_quiz

Разберем этот квиз

Коротко: dict.get возвращает значение по ключу или default, не изменяя словарь; dict.setdefault возвращает значение по ключу и, если ключа нет — вставляет default в словарь и возвращает его.

Ниже — исходный фрагмент и то, что он выведет, с объяснением.

python

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

Разбор по шагам

  • 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 вставит этот объект, и он будет общим для всех использований:
python

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

python

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

  • Если нужно просто получить значение по ключу или установить его в одну строку без побочных эффектов в других потоках, можно явно проверять наличие ключа или использовать конструкцию:
python

Однако setdefault короче, когда нужна именно вставка при отсутствии.

Краткий вывод

  • get возвращает default без изменения словаря.
  • setdefault при отсутствии ключа вставляет default в словарь и возвращает его.

Report Page