Если мы сделаем патологический картофель следующим образом:
>>> class Potato:
... def __eq__(self, other):
... return False
... def __hash__(self):
... return random.randint(1, 10000)
...
>>> p = Potato()
>>> p == p
False
Мы можем разбить наборы и dicts таким образом (обратите внимание: это то же самое, даже если __eq__
возвращает True
, он удаляет хэш, который их разбил):
>>> p in {p}
False
>>> p in {p: 0}
False
Также len({p: 0, p: 0}) == 2
и {p: 0}[p]
вызывает KeyError, в основном все связанные с отображением вещи выходят из окна, как и ожидалось.
Но я не ожидал, что мы не сможем разбить списки
>>> p in [p]
True
Почему? Кажется, что list.__contains__
выполняет итерацию, но сначала проверку личности перед проверкой равенства. Поскольку это означает, что идентификация означает равенство (см., Например, объект NaN), в чем причина короткого замыкания списков при сравнении идентичности?