? Нестандартная ситуация со словарями Мы знаем, что...
? Нестандартная ситуация со словарями
Мы знаем, что вы - любите Python, а еще больше любите необычные фишки. Но знали ли вы, что при работе со словарями могут возникать довольно не интуитивные ситуации?
❓ Посмотрите, чему будет равен my_dict?
» my_dict = {
1.0: 'One (float)',
1: 'One (int)',
True: 'One (bool)',
'1': 'One (string)'
}
# {1.0: 'One (bool)', '1': 'One (string)'}
Несмотря на добавление 4 отдельных ключей в словарь, можете ли вы объяснить, почему он оставляет только два из них?
✅ Мы знаем, что ключи должны быть уникальными и неизменяемыми. В данном случае нет никаких сомнений в том, что 1.0, 1 и True имеют разные типы данных.
» type(1.0), type(1), type(True)
# (float, int, bool)
Если посмотреть на их id, убедимся что и они различны:
» id(1.0), id(1), id(True)
# (139644507527152, 139645051222320, 9758592)
❌ Но дело не только в этом! Ключи должны быть еще хешируемы. Для поиска ключа, Python использует именно его хэш-значение, а не id. Значит посмотрим на их хэш-значения:
» hash(1.0), hash(1), hash(True)
# (1, 1, 1)
Вот и получается, поскольку они имеют одно и то же хэш-значение, словарь рассматривает их как одни и те же ключи.
? Но обратите еще внимание на итоговые ключ и значение: ключ - 1.0, в то время как значение соответствует ключу True.
❓Как так получилось?
Дело в том, что сначала 1.0 добавляется в качестве ключа, а значение устанавливается 'One (float)'. Затем, добавляя ключ 1, python распознает его как эквивалентное хэш-значение. И значение, соответствующее 1.0, перезаписывается на 'One (int)', в то время как ключ (1.0) сохраняется как есть.
Наконец, при добавлении True снова получаем эквивалентность хэша с существующим ключом 1.0. И снова, значение, которое изначально было 'One (float)' и обновлено до 'One (int)' на предыдущем шаге, перезаписывается на 'One (bool)'.
❓А почему сохранен строковый ключ '1'?
Тут все просто: он имеет уникальное хеш-значение, отличное от других ключей.
? Надеемся, что этот пост дал вам чуть более полное понимание работы словарей. Приходите к IT Resume на Симулятор "Аналитик данных", где мы с нуля обучаем SQL и Python и делимся полезными фишками!
#python@pylounge