Immuable signifie que l'objet ne changera pas de manière significative pendant sa durée de vie. Il s'agit d'une idée vague mais courante dans les langages de programmation.
La capacité de hachage est légèrement différente, et fait référence à la comparaison.
hachable Un objet est hachable s'il a une valeur de hachage qui ne change jamais pendant sa durée de vie (il a besoin d'une valeur de hachage). change pendant sa durée de vie (il a besoin d'une __hash__()
), et peut être comparé à d'autres objets (il a besoin d'une __eq__()
o __cmp__()
). Les objets hachables qui sont comparables doivent avoir la même valeur de hachage.
Toutes les classes définies par l'utilisateur ont __hash__
qui, par défaut, ne renvoie que l'identifiant de l'objet. Ainsi, un objet qui répond aux critères de hachage n'est pas nécessairement immuable.
Les objets de toute nouvelle classe que vous déclarez peuvent être utilisés comme clé de dictionnaire, à moins que vous ne l'empêchiez, par exemple, en lançant de __hash__
On pourrait dire que tous les objets immuables sont hachables, car si le hachage change pendant la durée de vie de l'objet, cela signifie que l'objet a muté.
Mais pas tout à fait. Considérons un tuple qui a une liste (mutable). Certains disent que le tuple est immuable, mais en même temps il n'est pas forcément hachable (throws).
d = dict()
d[ (0,0) ] = 1 #perfectly fine
d[ (0,[0]) ] = 1 #throws
Le hachage et l'immuabilité font référence à l'instancess de l'objet, pas au type. Par exemple, un objet de type tuple peut être hachable ou non.