Curiosidad sobre __hash__()

Chema Cortes pych3m4 en gmail.com
Vie Feb 6 09:44:28 CET 2009


El 2009/2/6 Francesc Alted <faltet en pytables.org> escribió:
> A Friday 06 February 2009, Chema Cortes escrigué:

>> PD Py3k warning: en python3 los objetos definidos por el usuario ya
>> no adquieren el método __hash__ por defecto. Se supone que basta con
>> tener los métodos __eq__ ó __cmp__ para poder ser índices de
>> diccionarios.
>
> Entonces, si no existe hash para ellos, cómo se hacen las búsquedas?  de
> manera lineal?

Los diccionarios han cambiado un poco en py3k, como el que ahora
puedes crear "vistas". Se decía de sacar un "warning" si se intentaba
poner un objeto sin método __hash__ como índice, pero no estoy seguro
de cómo se ha implementado al final. En cuanto pueda, te lo miro.


>> PD2: desconozco porqué el hash de un objeto definido por el usuario
>> no coincide con el valor que devuelve la función id(). En toda la
>> documentación que he consultado dice que debería ser lo mismo.
>> Supongo que habría que estudiar el código.
>
> No entiendo esto último:
>
> In [1]: class A:
>   ...:     pass
>   ...:
>
> In [2]: a = A()
>
> In [3]: id(a)
> Out[3]: 140367942406440
>
> In [4]: hash(a)
> Out[4]: 140367942406440
>
> o sea, que parece que sí que es así.  O me pierdo algo?

He probado varias instalaciones de python y casi siempre coincide id()
y hash(). Pero hay algunas que no, en concreto algunas arquitecturas
athlon64 como las basadas en Sempron.

In [1]: class A:pass
   ...:

In [2]: a=A()

In [3]: id(a),hash(a)
Out[3]: (3082955212L, -1212012084)
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es