True, 1 и 1.0 равны при сравнении и имеют одинаковый hash, поэтому считаются одним ключом. Последующие присваивания заменяют его значение, а строка '1' остаётся отдельным ключом.
Почему в словаре `{True: 1, 1: 2, 1.0: 3, "1": 4}` у ключа `True` итоговое значение равно `3`, а не `1`?
True, 1 и 1.0 равны при сравнении и имеют одинаковый hash, поэтому считаются одним ключом. Последующие присваивания заменяют его значение, а строка '1' остаётся отдельным ключом.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
True, 1 и 1.0 равны при сравнении и имеют одинаковый hash, поэтому считаются одним ключом. Последующие присваивания заменяют его значение, а строка '1' остаётся отдельным ключом.
values = {True: 1, 1: 2, 1.0: 3, '1': 4}
print(values) # {True: 3, '1': 4}
Сначала создаётся ключ True со значением 1, затем записи для 1 и 1.0 находят тот же ключ и обновляют значение до 3. Совпадения только hash недостаточно — важно ещё равенство ключей. В Python bool связан с целочисленной моделью, поэтому такое поведение согласовано с числовыми сравнениями. Для различения типов их нужно явно включить в состав ключа.