Подробное объяснение (по шагам)
1️⃣При создании словаря сначала добавляется пара True: "yes".
2️⃣Затем интерпретатор видит ключ 1. Так как тип bool наследуется от int, для питона True == 1. Их хэши тоже равны. Вместо создания нового ключа, обновляется значение старого: словарь становится {True: "no"}.
3️⃣Затем идёт ключ 1.0. Значение 1.0 == 1 == True. Снова происходит перезапись значения по существующему ключу.
4️⃣Итоговый словарь выглядит так: {True: "maybe"}. Его длина равна 1.
5️⃣При обращении d[True] мы получаем последнее сохранённое значение — "maybe".
Почему это важно
Задачка наглядно демонстрирует устройство хэш-таблиц (словарей и множеств) под капотом. Ключи считаются одинаковыми не по совпадению типов, а если их хэши равны (hash(a) == hash(b)) и сами объекты равны (a == b). Это нужно помнить при смешивании разных числовых типов в ключах.
Post #4705
942
- ✍ 7