2010-06-12 5 views
10

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.

+0

Nie jestem pewien, czy StackOverflow jest właściwym miejscem do powiedzenia tego ... – Artelius

+0

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. –

Odpowiedz

10

Zgaduję, że była to zmiana wprowadzona w Pythonie 3.x w celu poprawy wydajności. Sprawdź issue 5186, to wygląda trochę bardziej uważnie swoimi niedopasowane liczbach:

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

To chyba warto raportowania jako błąd dokumentacji.

+0

+1. Zdecydowanie warte zgłoszenia. –

+0

Odpowiedzi na wszystkie pytania i więcej. Dzięki. –