data = {1: 'value1', True: 'value2'}
С первого взгляда всё нормально. Давайте смотреть что у нас теперь есть в словаре>>> data[1]Кажется мы сломали питон) Но на самом деле нет. Это ошибка разработчика а не Python.
value2
>>> data[True]
value2
Дело в том, что на уровне данных для Python нет разницы между 1 и True.
Сам тип bool это производный клас от int
>>> issubclass(bool, int)Значение True это частный случай int, равный 1. Поэтому у них одинаковый хеш, и словарь их воспринимает как один и тот же ключ
True
>>> hash(1)Так что же у нас сейчас в словаре?
1
>>> hash(True)
1
>>> dataКлючи добавляются в порядке их следования. И если такой ключ уже существует, то вместо создания нового ключа просто обновляется его значение. Поэтому у нас всего один ключ и это 1 а не True.
{1: 'value2'}
Чтобы избежать такой путаницы, возмите себе за правило ключи всегда делать одного типа.
C "0" и False всё аналогично.
#tricks