2010-06-12 11 views
10

Lo siguiente es de la documentación de Python v3.1.2:Al contrario de Python 3.1 Docs, hash (obj)! = Id (obj). Entonces, ¿cuál es correcto?

desde el lenguaje Python Sección de Referencia 3.3.1 Personalización básica:

object.__hash__(self) 

... User-defined classes have __eq__() and __hash__() methods 
by default; with them, all objects compare unequal (except 
with themselves) and x.__hash__() returns id(x). 

del glosario:

hashable 

... Objects which are instances of user-defined classes are 
hashable by default; they all compare unequal, and their hash 
value is their id(). 

Esto es cierto hasta la versión 2.6.5:

Python 2.6.5 (r265:79096, Mar 19 2010 21:48:26) ... 
... 
>>> class C(object): pass 
... 
>>> c = C() 
>>> id(c) 
11335856 
>>> hash(c) 
11335856 

Pero en la versión 3.1.2:

Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) ... 
... 
>>> class C: pass 
... 
>>> c = C() 
>>> id(c) 
11893680 
>>> hash(c) 
743355 

¿Qué es? ¿Debo informar un error de documentación o un error del programa? Y si se trata de un error de documentación, y el valor hash() predeterminado para una instancia de clase de usuario ya no es el mismo que el valor id(), entonces sería interesante saber qué es o cómo se calcula y por qué fue cambiado en la versión 3.

+0

No estoy seguro StackOverflow es el lugar correcto para decir esto ... – Artelius

+0

Tenga en cuenta que ni siquiera es necesariamente cierto que 'x .__ hash __() == id (x)' en CPython 2.6: en una plataforma (por ejemplo, 64 -bit Windows) donde son posibles valores 'id' más grandes que' LONG_MAX', el valor 'id (x)' podría truncarse para dar el hash. –

Respuesta

10

Supongo que esto fue un cambio realizado en Python 3.x para mejorar el rendimiento. Salida issue 5186, y luego mirar un poco más de cerca a sus números coincidentes:

>>> bin(11893680) 
'0b101101010111101110110000' 
>>> bin(743355) 
'0b10110101011110111011' 
>>> 11893680 >> 4 
743355 

Es probable que sea digno de mención como un error de documentación.

+0

+1. Definitivamente vale la pena informar. –

+0

Todas las preguntas respondidas, y más. Gracias. –

Cuestiones relacionadas