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