Inmutable significa que el objeto no cambiará de manera significativa durante su vida. Es una idea vaga pero común en los lenguajes de programación.
Habilidad es ligeramente diferente y se refiere a la comparación.
hash Un objeto es hash si tiene un valor hash que nunca cambia durante su vida útil (necesita un__hash__()
método) y se puede comparar con otros objetos (necesita unmétodo__eq__()
o__cmp__()
). Los objetos hash que se comparan iguales deben tener el mismo valor hash.
Todas las clases definidas por el usuario tienen un __hash__
método, que de forma predeterminada solo devuelve el ID del objeto. Por lo tanto, un objeto que cumple los criterios de capacidad de acceso no es necesariamente inmutable.
Los objetos de cualquier clase nueva que declare se pueden usar como clave de diccionario, a menos que lo impida, por ejemplo, lanzando desde __hash__
Podríamos decir que todos los objetos inmutables son hash, porque si el hash cambia durante la vida del objeto, significa que el objeto mutó.
Pero no del todo. Considere una tupla que tiene una lista (mutable). Algunos dicen que la tupla es inmutable, pero al mismo tiempo, no se puede mezclar (arroja).
d = dict()
d[ (0,0) ] = 1
d[ (0,[0]) ] = 1
La habilidad y la inmutabilidad se refieren al instante de objeto, no al tipo. Por ejemplo, un objeto de tipo tupla puede ser hash o no.
HashMap
se rompe si modifica un objeto utilizado como clave en él: no se puede encontrar ni la clave nueva ni la antigua, aunque si imprime el mapa, se puede ver allí.