Sobes.tech
Back to questions
Junior — Middle
48

Объясните, каким образом реализуется сравнение объектов через __eq__, если эти объекты используются в качестве ключей в словаре?

Companies where asked
OkkoOkko

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__ нет или реализован некорректно, словарь может работать неправильно.