Seite 1 von 1

meinObjekt anstelle von meinObjekt.name benutzen?

Verfasst: Freitag 27. Februar 2009, 09:01
von Goswin
Einige größere Objekte von mir haben eindeutige Namen, die auch in __str__ verwendet werden. Bisher habe ich diese Objekte verschiedene Male als Keys in Dictionaries eingesetzt, und dabei stets Ausdrücke wie

Code: Alles auswählen

daten = {}
daten[obja.name, objb.name] = was_immer_ich_hier_brauche
Ich bemerke nun plötzlich, dass das Programm ebenfalls richtig durchläuft, wenn ich einfach nur folgendes schreibe:

Code: Alles auswählen

daten[obja, objb] = was_immer_ich_hier_brauche
Hatte ich mir vorher das Leben unnötigerweise kompliziert gemacht oder ist diese zweite Alternative in irgendeinem Sinn deutlich schlechter als die erste? (Ich staune immer noch darüber, dass diese Objekte überhaupt als Keys verwendbar sind)

Verfasst: Freitag 27. Februar 2009, 09:22
von BlackJack
`dict()` (und `set()`) verwenden Vergleiche und den Hashwert eines Objekts. Wenn also `__eq__()` oder `__cmp__()` und `__hash__()` so implementiert sind, dass sie zusammen passen, kann man die Objekte als Schlüssel verwenden.

Es muss sicher gestellt sein, dass aus ``a == b`` immer folgt, dass ``hash(a) == hash(b)`` gilt.

Wenn man weder `__eq__()` oder `__cmp__()`, oder `__hash__()` überschreibt, gilt diese Voraussetzung. Die CPython Implementierung verwendet dann AFAIK sowohl für den Vergleich als auch den Hashwert die Objektidentität.