Вывод словаря после переопределения ключей

Будет {1: 'beegeek'}. Ключи 1 и True равны и имеют одинаковый хеш, поэтому второе присваивание обновляет ту же запись.

Короткий ответ

Что ответить на собеседовании

Будет {1: 'beegeek'}. Ключи 1 и True равны и имеют одинаковый хеш, поэтому второе присваивание обновляет ту же запись.

Подробный разбор

Ответ с пояснениями

Условие

Что будет напечатано после выполнения программы? Варианты ответа:

  • {1: 'stepik', True: 'beegeek'}
  • {1: 'beegeek'}
  • {True: 'beegeek'}
  • {True: 'stepik'}
  • {1: 'stepik'}
  • возникнет ошибка
my_dict = {}
my_dict[1] = 'stepik'
my_dict[True] = 'beegeek'
print(my_dict)

Ответ

Будет {1: 'beegeek'}. Ключи 1 и True равны и имеют одинаковый хеш, поэтому второе присваивание обновляет ту же запись.

В Python True == 1 и hash(True) == hash(1). Словарь использует хеш и равенство, а не исключительно тип ключа, поэтому не создаёт вторую запись.

assert len(my_dict) == 1
assert my_dict[1] == my_dict[True] == 'beegeek'

Первым вставлен ключ 1, и обновление через равный ему ключ сохраняет эту запись, меняя только значение. Для хранения чисел и булевых значений как принципиально разных ключей можно использовать составной ключ (type(value), value). Аналогичное совпадение возможно между 1 и 1.0.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее