Inmutables significa que el objeto no cambiará de manera significativa durante su vida útil. Es una idea vaga pero común en los lenguajes de programación.
La capacidad de cambio es ligeramente diferente, y se refiere a la comparación.
hashable un objeto es hashable si tiene un valor hash que nunca cambios durante su vida útil (se necesita un método __hash__()
), y puede ser en comparación con otros objetos (que necesita un método __eq__()
o __cmp__()
) Los objetos hashables que se comparan iguales deben tener el mismo valor hash.
Todas las clases definidas por el usuario tienen el método __hash__
, que de forma predeterminada solo devuelve el ID del objeto. Por lo tanto, un objeto que cumpla con los criterios de capacidad de transferencia no es necesariamente inmutable.
objetos de cualquier nueva clase se declara pueden utilizarse como clave de un diccionario, a menos que se impide que, por ejemplo, tirando de __hash__
Podríamos decir que todos los objetos inmutables son hashable, porque si los cambios de hash 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 es algo lavable (arroja).
d = dict()
d[ (0,0) ] = 1 #perfectly fine
d[ (0,[0]) ] = 1 #throws
La capacidad de transferencia y la inmutabilidad se refieren al objeto instancess, no al tipo. Por ejemplo, un objeto de tipo tuple puede ser hashable o no.
Además, no es posible que las tablas hash detecten cuándo cambia el hash de sus teclas (al menos de forma eficiente). Es una trampa común, p. en Java, donde un 'HashMap' se rompe si modifica un objeto utilizado como clave: no se puede encontrar ninguna clave antigua ni nueva, aunque si imprime el mapa, se puede ver allí. – doublep
Hashable e Inmutable están relacionados de alguna manera pero no son lo mismo. P.ej. Las instancias creadas a partir de clases personalizadas que heredan 'object' son procesables pero no inmutables. Estas instancias se pueden usar con las claves de un dict, pero aún se pueden modificar si se transmiten. –