В этих случаях, связанных с хэшем, он использует как __hash__
, так и __eq__
.
Если __hash__
и __eq__
одинаковы, то первый, в который он попадаетитерация берется.Когда он добирается до следующего, он проверяет, есть ли он у него, и решает, что да.
>>> class Same(object):
... def __init__(self, value):
... self.value = value
... def __hash__(self):
... return 42
... def __eq__(self, other):
... return True
... def __repr__(self):
... return 'Same(%r)' % self.value
>>> set([Same(2), Same(1)])
set([Same(2)])
>>> set([Same(1), Same(2)])
set([Same(1)])
С dict
становится интереснее:
>>> {Same(1): 1, Same(2): 2}
{Same(1): 2}
>>> {Same(1): 2, Same(2): 1}
{Same(1): 1}
>>> {Same(2): 1, Same(2): 2}
{Same(2): 2}
>>> {Same(2): 2, Same(2): 1}
{Same(2): 1}
>>> {Same(2): 2, Same(2): 1}
{Same(2): 1}
Вам следуетв состоянии угадать, что здесь происходит.Он хранит первый элемент, тогда хэш / равенство второго совпадает;однако, у него есть другое значение, поэтому он хранит его.Значение всегда перезаписывается независимо от того, совпадают они или нет:
>>> {Same(1): Same(2), Same(3): Same(4)}
{Same(1): Same(4)}
Надеюсь, это поможет.