Что делает оператор == на языке Python?
Рассмотрим:
>>> a = {'foo': {'bar': 3}}
>>> b = {'foo': {'bar': 3}}
>>> a == b
True
В соответствии с документом python вы действительно можете использовать оператор ==
в словарях.
Что на самом деле происходит здесь? Является ли Python рекурсивной проверкой каждого элемента словарей для обеспечения равенства? Убедитесь, что ключи идентично совпадают, и значения также идентично совпадают?
Есть ли документация, которая точно определяет, что означает ==
в словаре? Или я должен реализовать свою собственную версию проверки равенства?
(Если работает оператор ==
, почему нет dicts hashable? То есть, почему я не могу создать набор() dicts или использовать dict в качестве словарного ключа?)
Ответы
Ответ 1
Python рекурсивно проверяет каждый элемент словарей, чтобы обеспечить равенство. См. C dict_equal()
реализация, которая проверяет каждый ключ и значение (при условии, что словари имеют одинаковую длину); если словарь b
имеет тот же самый ключ, тогда PyObject_RichCompareBool
проверяет, соответствуют ли значения; это по существу рекурсивный вызов.
Словари не хешируются, потому что их атрибут __hash__
установлен в None
, и, прежде всего, они изменяемы, что запрещено при использовании в качестве словаря ключ.
Если вы должны использовать словарь в качестве ключа и через существующую ссылку, тогда измените ключ, тогда этот ключ больше не будет помещаться в одну и ту же позицию в хеш-таблице. Используя другой, равный словарь (если он равен неизмененному словарю или замененному словарю), чтобы попытаться получить значение, теперь больше не будет работать, потому что будет выбран неправильный слот или ключ больше не будет равен.
Ответ 2
От docs:
Сопоставления (словари) сравниваются равными тогда и только тогда, когда их сортировка (ключ, значение) сравнивают равные. [5] Исходы, отличные от равенства, разрешены последовательно, но не определены иным образом. [6]
Сноска [5]:
Реализация вычисляет это эффективно, без построения списки или сортировку.
Сноска [6]:
В более ранних версиях Python использовалось лексикографическое сравнение отсортированных (ключ, значение), но это было очень дорого для обычного случая сравнение для равенства. Еще более ранняя версия Python по сравнению словари только по идентичности, но это вызвало сюрпризы, потому что люди ожидали, что смогут проверить словарь на пустоту сравнивая его с {}.
Ответ 3
Словари равны, если они имеют одинаковые ключи и одинаковые значения для каждой клавиши.
Смотрите несколько примеров:
dict(a=1,b=2)==dict(a=2,b=1)
False
dict(a=1,b=2)==dict(a=1,b=2,c=0)
False
dict(a=1,b=2)==dict(b=2,a=1)
True