Jeśli zrobimy patologiczny ziemniak tak:Dokonywanie przedmiot x takie, że „x w [x]” zwraca false
>>> class Potato:
... def __eq__(self, other):
... return False
... def __hash__(self):
... return random.randint(1, 10000)
...
>>> p = Potato()
>>> p == p
False
Możemy przełamać zbiorów i dicts ten sposób (uwaga: to samo nawet jeśli __eq__
powraca True
, to mucking z mieszania, które je złamał):
>>> p in {p}
False
>>> p in {p: 0}
False
także len({p: 0, p: 0}) == 2
i {p: 0}[p]
podnosi KeyError, przede wszystkim związanych z odwzorowaniem rzeczy wychodzi przez okno, jak oczekiwać ed.
Ale co ja nie spodziewałem się, że nie mogęlisty przerwa
>>> p in [p]
True
Dlaczego tak jest? Wygląda na to, że list.__contains__
iteruje, ale najpierw sprawdza, czy równość jest równa. Ponieważ nie jest tak, że tożsamość oznacza równość (patrz na przykład obiekt NaN), jaki jest powód, dla którego listy zwierają porównania tożsamości?
Może 'list .__ zawiera__' może porównywać obiekty według' id() 'zamiast' eq() '? '(id (p) == id (p)) to prawda' –
@jonrsharpe OP już o tym wie. Myślę, że chce zrozumieć, dlaczego List najpierw sprawdza tożsamość obiektu, a nie równość, jak sądzę. – thefourtheye
@ HåkenLid tak, tak to robi, myślę, że OP pyta * dlaczego *. – jonrsharpe