Я сталкивался с примером странного поведения при переходе некоторого кода с python 2 на python 3. Ниже приведен минимальный (?) Пример этого:
class Bar(object):
def __init__(self, x):
self.x = x
def __eq__(self, other):
return self.x == other.x
b = Bar(1)
print(hash(b))
при запуске с python2
,этот код производит некоторый вывод (хеш Bar(1)
), в то время как python3
вызывает TypeError: unhashable type: 'Bar'
, это означает, что __hash__
каким-то образом наследуется (от object
?) в Python 2.
Итак, мои вопросы: что такое хэш Bar(1)
в python 2?И почему поведение отличается?