Будет {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.