Dies wäre ähnlich wie bei der java.lang.Object.hashcode()
Methode.
Ich muss Objekte, über die ich keine Kontrolle habe, in einem Satz speichern und sicherstellen, dass die Werte nur überschrieben werden, wenn zwei Objekte tatsächlich dasselbe Objekt sind (nicht dieselben Werte enthalten).
hashCode()
Java nicht unbedingt eindeutig ist, sondern nur eine sorgfältig ausgewählte Semantik in Verbindung mitequals()
.hash()
hat genau die gleiche Semantik wiejava.lang.Object.hashcode()
.Antworten:
wird den Trick für Sie tun. Aber ich bin neugierig, was ist falsch an der Menge von Objekten (die Objekte nach Wert kombiniert)?
Für Ihr spezielles Problem würde ich wahrscheinlich den Satz von IDs oder Wrapper-Objekten behalten. Ein Wrapper-Objekt enthält eine Referenz und wird mit
x==y
<==> verglichenx.ref is y.ref
.Es ist auch erwähnenswert, dass Python-Objekte ebenfalls eine
hash
Funktion haben. Diese Funktion ist erforderlich, um ein Objekt in eine Menge oder ein Wörterbuch einzufügen. Es soll manchmal für verschiedene Objekte kollidieren, obwohl gute Implementierungenhash
versuchen, es weniger wahrscheinlich zu machen.quelle
id(x)
sich „für dieses Objekt während seiner Lebensdauer einzigartig und konstant ist garantiert“ , die in verschiedenen Objekten mit den gleichen Wert mit unterschiedlichen ids (solange sie beide exist zugleich) ergeben, die würde es dem OP ermöglichen, das zu tun, was sie wollten.id()
scheint dieselbe ID für wiederholt erstellte (und zerstörte) Objekte mit demselben Wert zurückzugeben, daher mein ursprünglicher Kommentar, aber eigentlich ist das hier in Ordnung, da OP angegeben hat, dass die IDs eindeutig sein müssen, wenn die Objekte koexistieren. Meine Abwahl entfernen.x.ref
in diesem Fall der Name der Eigenschaft im Wrapper, die einen Verweis auf das Original enthältx
, nachdem der Wrapper der Variablen zugewiesen wurdex
.Dafür ist "
is
" da.Anstatt "
if a == b
" zu testen , das auf den gleichen Wert prüft,test "
if a is b
", der auf dieselbe Kennung testet.quelle
Wie ilya n erwähnt, erzeugt id (x) eine eindeutige Kennung für ein Objekt.
Ihre Frage ist jedoch verwirrend, da die hashCode-Methode von Java keine eindeutige Kennung angibt. Javas HashCode funktioniert wie die meisten Hash-Funktionen: Er gibt immer den gleichen Wert für das gleiche Objekt zurück, zwei Objekte, die gleich sind, erhalten immer gleiche Codes, und ungleiche Hash-Werte implizieren ungleiche Hash-Codes. Insbesondere können zwei unterschiedliche und ungleiche Objekte den gleichen Wert erhalten.
Dies ist verwirrend, da sich kryptografische Hash-Funktionen stark davon unterscheiden und eher (wenn auch nicht genau) der von Ihnen angeforderten "eindeutigen ID" entsprechen.
Das Python-Äquivalent der hashCode-Methode von Java ist hash (x).
quelle
hash(.)
funktioniert es nicht für Listen ... Ich weiß, dass die Liste veränderbar ist, aber ich muss nur eine Nummer basierend auf dem Inhalt der Liste generieren. Vielleicht Summe (myList), als schlechte Hash-Funktion ...Sie müssen Objekte nicht vergleichen, bevor Sie sie in einem Set platzieren. Die Semantik von set () kümmert sich bereits darum.
class A(object): a = 10 b = 20 def __hash__(self): return hash((self.a, self.b)) a1 = A() a2 = A() a3 = A() a4 = a1 s = set([a1,a2,a3,a4]) s => set([<__main__.A object at 0x222a8c>, <__main__.A object at 0x220684>, <__main__.A object at 0x22045c>])
Hinweis: Sie müssen Hash wirklich nicht überschreiben , um dieses Verhalten zu beweisen :-)
quelle
class B(str): pass
Wenn mit aufgerufen wird,set([B(), B()])
führt zuset([''])
. Die Identifizierung aus Wörterbüchern hängt normalerweise implizit vonid(x)
Objekten ab. Sie sollten sie nur explizit verwenden und Eckfälle vermeiden.