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.
No estoy seguro StackOverflow es el lugar correcto para decir esto ... – Artelius
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. –