Неизменяемость означает, что объект не изменится каким-либо существенным образом в течение его срока службы. Это неопределенная, но распространенная идея в языках программирования.
Hashability немного отличается, и относится к сравнению.
hashable Объект является хэшируемым, если он имеет хеш-значение, которое никогда
изменяется в течение срока службы (для этого требуется метод __hash__()
) и может быть
по сравнению с другими объектами (для этого требуется метод __eq__()
или __cmp__()
).
Хэшируемые объекты, которые сравниваются равными, должны иметь одинаковое хеш-значение.
Все пользовательские классы имеют метод __hash__
, который по умолчанию просто возвращает идентификатор объекта. Таким образом, объект, который соответствует критериям для хешабельности, не обязательно является неизменным.
Объекты любого нового класса, который вы объявляете, могут использоваться в качестве ключа словаря, если вы не предотвратите это, например, бросив из __hash__
Мы могли бы сказать, что все неизменяемые объекты являются хэшируемыми, потому что, если хэш изменяется в течение жизни объекта, то это означает, что объект мутировал.
Но не совсем. Рассмотрим кортеж, у которого есть список (изменяемый). Некоторые говорят, что кортеж неизменен, но в то же время он не является хэшируемым (бросает).
d = dict()
d[ (0,0) ] = 1 #perfectly fine
d[ (0,[0]) ] = 1 #throws
Хешабильность и неизменность относятся к экземпляру объекта, а не к типу. Например, объект типа кортеж может быть хэшируемым или нет.