¿Qué significa “hashable” en Python?

Intenté buscar en Internet pero no pude encontrar el significado de hashable.

Cuando dicen que los objetos son objetos hashable o hashable objects ¿qué significa?

Desde el glosario de Python :

Un objeto es hashable si tiene un valor hash que nunca cambia durante su vida útil (necesita un __hash__() ) y puede compararse con otros objetos (necesita un __eq__() o __cmp__() ). Los objetos hash que comparen iguales deben tener el mismo valor hash.

La capacidad de hash hace que un objeto se pueda utilizar como clave de diccionario y como miembro de conjunto, porque estas estructuras de datos utilizan el valor de hash internamente.

Todos los objetos inmutables incorporados de Python son hashable, mientras que no hay contenedores mutables (como listas o diccionarios). Los objetos que son instancias de clases definidas por el usuario son hashable por defecto; todos se comparan de forma desigual, y su valor hash es su id() .

Todas las respuestas aquí tienen una buena explicación de trabajo de los objetos hashable en python, pero creo que uno necesita entender primero el término Hashing.

Hashing es un concepto en informática que se utiliza para crear estructuras de datos de alto rendimiento y acceso pseudoaleatorio donde se almacena y se accede a una gran cantidad de datos rápidamente.

Por ejemplo, si tiene 10,000 números de teléfono y desea almacenarlos en una matriz (que es una estructura de datos secuencial que almacena datos en ubicaciones de memoria contiguas y proporciona acceso aleatorio), pero es posible que no tenga la cantidad necesaria de contiguos Ubicaciones de memoria.

Por lo tanto, puede utilizar una matriz de tamaño 100 y usar una función hash para asignar un conjunto de valores a los mismos índices, y estos valores se pueden almacenar en una lista vinculada. Esto proporciona un rendimiento similar a una matriz.

Ahora, una función hash puede ser tan simple como dividir el número con el tamaño de la matriz y tomar el rest como índice.

Para obtener más detalles, consulte https://en.wikipedia.org/wiki/Hash_function

Aquí hay otra buena referencia: http://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html

Cualquier cosa que no sea mutable (medios mutables, que probablemente cambien) puede ser modificada. Además de la función hash para buscar, si una clase lo tiene, por ejemplo. dir(tuple) y buscando el método __hash__ , aquí hay algunos ejemplos

 #x = has(set([1,2])) #set unhashable x = hash(frozenset([1,2])) #hashable #x = hash(([1,2], [2,3])) #tuple of mutable objects, unhashable x = hash((1,2,3)) #tuple of immutable objects, hashable #x = hash() #x = hash({1,2}) #list of mutable objects, unhashable #x = hash([1,2,3]) #list of immutable objects, unhashable 

Lista de tipos inmutables:

 int, float, decimal, complex, bool, string, tuple, range, frozenset, bytes 

Lista de tipos mutables:

 list, dict, set, bytearray, user-defined classes 

En mi entendimiento de acuerdo con el glosario de Python, cuando creas una instancia de objetos hashable, también se calcula un valor inalterable de acuerdo con los miembros o valores de la instancia. Por ejemplo, ese valor podría usarse como clave en un dict como se muestra a continuación:

 >>> tuple_a = (1,2,3) >>> tuple_a.__hash__() 2528502973977326415 >>> tuple_b = (2,3,4) >>> tuple_b.__hash__() 3789705017596477050 >>> tuple_c = (1,2,3) >>> tuple_c.__hash__() 2528502973977326415 >>> id(a) == id(c) # a and c same object? False >>> a.__hash__() == c.__hash__() # a and c same value? True >>> dict_a = {} >>> dict_a[tuple_a] = 'hiahia' >>> dict_a[tuple_c] 'hiahia' 

podemos encontrar que el valor hash de tuple_a y tuple_c es el mismo ya que tienen los mismos miembros. Cuando usamos tuple_a como clave en dict_a, podemos encontrar que el valor para dict_a [tuple_c] es el mismo, lo que significa que, cuando se usan como clave en un dict, devuelven el mismo valor porque los valores de hash son lo mismo. Para aquellos objetos que no son hashable, el método hash se define como Ninguno:

 >>> type(dict.__hash__)  

Supongo que este valor de hash se calcula en la inicialización de la instancia, no de forma dinámica, es por eso que solo los objetos inmutables son hashable. Espero que esto ayude.

Déjame darte un ejemplo práctico para entender los objetos hashable en python. Estoy tomando 2 tuplas para este ejemplo. Cada valor en una tupla tiene un Valor Hash único que nunca cambia durante su vida útil. Así que en base a esto tiene valor, se hace la comparación entre dos tuplas. Podemos obtener el valor hash de un elemento de tupla utilizando el Id ().

Comparación entre 2 tuplasEquivalencia entre 2 tuplas

En python significa que el objeto puede ser miembro de conjuntos para devolver un índice. Es decir, tienen una identidad / id única.

por ejemplo, en python 3.3:

Las listas de la estructura de datos no son hashables, pero las tuplas de la estructura de datos son hashables.