Poniżej z dokumentacją Python v3.1.2:W przeciwieństwie do Python 3.1.1 Dokumenty, hash (obj)! = Id (obj). Więc co jest poprawne?
Od pytona Język Odniesienia Rozdział 3.3.1 Podstawowe Dostosowanie:
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).
From The Słowniczek:
hashable
... Objects which are instances of user-defined classes are
hashable by default; they all compare unequal, and their hash
value is their id().
To prawda do wersji 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
Ale w wersji 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
Więc co to jest? Czy powinienem zgłosić błąd w dokumentacji lub błąd programu? A jeśli jest to błąd związany z dokumentacją, a domyślna wartość hash()
dla instancji klasy użytkownika nie jest już taka sama jak w przypadku wartości id()
, to interesująca byłaby informacja, co to jest lub jak jest obliczana i dlaczego była zmieniona w wersji 3.
Nie jestem pewien, czy StackOverflow jest właściwym miejscem do powiedzenia tego ... – Artelius
Pamiętaj, że nie musi to być prawda, że 'x .__ hash __() == id (x)' w CPython 2.6: na platformie (np. 64 -bitowy system Windows), gdzie możliwe są wartości "id" większe niż "LONG_MAX", wartość "id (x)" może zostać obcięta w celu nadania wartości skrótu. –