Вопреки Документам Python 3.1, хеш (obj)! = идентификатор (obj). Таким образом, который корректен?

Следующее из документации Python v3.1.2:

От справочного отдела языка Python 3.3.1 основных настройки:

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

Из глоссария:

hashable

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

Это, регулируют через версию 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

Но в версии 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

Таким образом, который является этим? Я должен сообщить об ошибке документации или ошибке программы? И если это - ошибка документации и значение по умолчанию hash() значение для пользовательского экземпляра класса больше не является тем же как id() значение, затем было бы интересно знать то, что это или как вычисляется, и почему это было изменено в версии 3.

10
задан Don O'Donnell 12 June 2010 в 07:12
поделиться

1 ответ

Я предполагаю, что это изменение было внесено в Python 3.x для повышения производительности. Ознакомьтесь с проблемой 5186 , а затем посмотрите внимательнее на свои несовпадающие числа:

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

Вероятно, об этом стоит сообщить как об ошибке в документации.

10
ответ дан 4 December 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: