Ich versuche zu verstehen, was Python-Wörterbücher intern tun müssen, um einen Schlüssel zu finden. Es scheint mir, dass Hash zuerst ausgewertet werden würde, und wenn es eine Kollision gibt, würde Python durch die Schlüssel durchlaufen, bis es einen findet, für den eq True zurückgibt. Das macht mich fragen, warum der folgende Code funktioniert (Test-Code nur für die Interna verstehen):Was ist die Reihenfolge der Auswertung von __hash__ und __eq__ für ein Python-Diktat?
class MyClass(object):
def __eq__(self, other):
return False
def __hash__(self):
return 42
if __name__=='__main__':
o1 = MyClass()
o2 = MyClass()
d = {o1: 'o1', o2: 'o2'}
assert(o1 in d) # 1
assert(d[o1]=='o1') # 2
assert(o2 in d) # 3
assert(d[o2]=='o2') # 4
Sollte nicht das Wörterbuch die richtigen Schlüssel zu finden, nicht in der Lage sein (entweder ‚o1‘ oder ‚o2‘ in beide Rückkehr Fälle # 2 und # 4, oder werfen einen Fehler, abhängig von der internen Implementierung). Wie kann es in beiden Fällen auf den richtigen Schlüssel landen, wenn es niemals in der Lage sein sollte, die Schlüssel korrekt zu "setzen" (da eq False zurückgibt).
Die gesamte Dokumentation ich auf Hashing gesehen habe erwähnt immer Hash und eq zusammen, nie cmp, ne usw., die mir diese 2 sind die Einzigen, die denken lässt, die eine Rolle spielen Szenario.
Also würde in seinem Beispiel o1 == o1 False zurückgeben, aber ID (o1) == ID (o1) würde True zurückgeben? –
Ich habe es gerade versucht und o1 == o1 gibt False zurück und id (o1) == id (o1) gibt True zurück –
@TimurRidjanovic: Ja. 'is' ist jedoch eine sicherere und manchmal effizientere Möglichkeit, die Objektidentität zu vergleichen. – user2357112