Back to questions
Okko
Junior — Middle
48
Объясните, каким образом реализуется сравнение объектов через __eq__, если эти объекты используются в качестве ключей в словаре?
Companies where asked
Answer from AI
sobes.tech AI
В Python объекты, используемые в качестве ключей словаря, должны быть хешируемыми. При добавлении ключа в словарь вызывается метод __hash__ объекта для определения корзины (bucket) в хеш-таблице. Если при поиске ключа возникает коллизия (разные объекты с одинаковым хешем), тогда вызывается метод __eq__ для сравнения объектов на равенство.
Таким образом, для корректной работы словаря важно, чтобы:
- Если два объекта равны по
__eq__, то их хеши (__hash__) тоже должны совпадать. - Метод
__eq__должен корректно определять равенство объектов.
Пример:
class MyKey:
def __init__(self, val):
self.val = val
def __eq__(self, other):
if isinstance(other, MyKey):
return self.val == other.val
return False
def __hash__(self):
return hash(self.val)
key1 = MyKey(10)
key2 = MyKey(10)
my_dict = {key1: 'value'}
print(my_dict[key2]) # Выведет 'value', так как key1 == key2 и хеши совпадают
Если __eq__ реализован, но __hash__ нет или реализован некорректно, словарь может работать неправильно.