Документация гласит, что ключами могут быть только неизменяемые типы данных. Почему в данном случае не возникает ошибка?
class Test: passt = Test()print({t: 1})
PythonLib
Питон для всех
question@mail.ru
·
01.01.1970 03:00
Документация гласит, что ключами могут быть только неизменяемые типы данных. Почему в данном случае не возникает ошибка?
class Test: passt = Test()print({t: 1})
answer@mail.ru
·
01.01.1970 03:00
Попробую ответить, т.к. вопрос интересный и сам не знал почему.
Коротко: причина в наличии магическом методе
Если мы используем словарь как ключ:
t = dict()d = {t: 1}То получаем ошибку:
TypeError: unhashable type: 'dict'Но, вообще-то, эту же ошибку получим, если попробуем получить хеш:
t = dict()print(hash(t))У не хешируемых типов, магический метод отсутствует:
t = dict()print(t.__hash__)# NoneВот так выглядит наличие этого метода:
print(Test.__hash__)# <slot wrapper '__hash__' of 'object' objects>t = Test()print(t.__hash__)# <method-wrapper '__hash__' of Test object at ...Мы это легко проверим на нашем классе Test:
class Test: __hash__ = Nonet = Test()d = {t: 1}Знакомая ошибка:
TypeError: unhashable type: 'Test'ℹ️ Выходит, что у классов, по-умолчанию, есть метод , поэтому их можно использовать в ключах словаря и в других местах (типа множеств), реализованных через хеши
Кст, по-умолчанию, хеш высчитывается из id объекта деленного на 16.
Тут будет одинаковый результат:
class Test: passt = Test()print(hash(t))print(hash(id(t) // 16))