meinObjekt anstelle von meinObjekt.name benutzen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Goswin
User
Beiträge: 361
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen

meinObjekt anstelle von meinObjekt.name benutzen?

Beitragvon Goswin » Freitag 27. Februar 2009, 09:01

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)
BlackJack

Beitragvon BlackJack » Freitag 27. Februar 2009, 09:22

`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.

Wer ist online?

Mitglieder in diesem Forum: harryberlin