Geschichte der Frage:
Dictionaries (dict) sind einer der grundlegenden Datentypen in Python und stellen eine „Schlüssel-Wert“-Struktur dar. Dictionaries gibt es seit der ersten Version von Python, aber ihre interne Implementierung und Verhaltensweisen wurden ständig verbessert (z.B. wird ab Python 3.7 die Einfügereihenfolge garantiert).
Problem:
Das Verständnis des Aufbaus eines Dictionaries ist notwendig, um effizient Code zu schreiben. Ohne Wissen über die Feinheiten entstehen Bugs beim Einsatz von veränderbaren Typen als Schlüssel, beim Kopieren verschachtelter Dictionaries sowie bei untypischen Operationen.
Lösung:
Ein Dictionary wird als Hash-Tabelle implementiert; Schlüssel müssen unbedingt hashierbar (immutable) sein. Der Zugriff auf den Wert über den Schlüssel funktioniert nahe an O(1), aber unter bestimmten Bedingungen treten Besonderheiten auf - beispielsweise bei Kollisionen oder der Verarbeitung großer Datenmengen.
Beispielcode:
person = {'name': 'Alice', 'age': 30} person['city'] = 'Moscow' print(person['name']) # Alice
Wichtige Merkmale:
Kann man eine Liste (list) als Schlüssel in einem dict verwenden?
Nein, Listen sind veränderlich und nicht hashierbar. Der Versuch, eine Liste zu verwenden, verursacht einen Fehler.
d = {} d[[1, 2, 3]] = 'value' # TypeError: unhashable type: 'list'
Was passiert, wenn man zwei Tuples mit identischem Inhalt als Schlüssel verwendet?
Wenn beide Tuples die gleichen Daten enthalten und unveränderlich sind, gelten sie als gleich, und die Schlüssel im Dictionary stimmen überein:
t1 = (1, 2) t2 = (1, 2) d = {t1: 'a'} print(d[t2]) # 'a'
Ändert sich die Reihenfolge beim Durchlaufen der Elemente des Dictionaries beim Kopieren?
In Python-Versionen 3.7+ bleibt die Reihenfolge erhalten. In älteren Versionen ist die Durchlaufreihenfolge nicht garantiert.
d1 = {'a': 1, 'b': 2} d2 = dict(d1) print(list(d2)) # ['a', 'b']
dict.get() ohne Überprüfung auf None kann zu unerwarteten Fehlern führen, wenn der Wert == None ist.Ein Programmierer verwendet Listen als Schlüssel und glaubt fälschlicherweise, dass tuple und list in Python gleichwertig als Schlüssel sind. Er erhält Ausnahmen in Form von "unhashable type".
Vorteile:
Man kann schnell etwas „aus dem Stegreif“ ausprobieren und beliebige Strukturen verwenden.
Nachteile:
Laufzeitfehler, Bugs bei der Datenverarbeitung.
Es werden nur unveränderliche (hashierbare) Objekte als Schlüssel verwendet; die Tuples sind so gestaltet, dass sie keine veränderbaren Elemente enthalten.
Vorteile:
Schnelligkeit der Schlüsselabfrage, Zuverlässigkeit der Struktur, einfache Verarbeitung und Kopie.
Nachteile:
Wenn die Daten komplex sind, ist zusätzliche Verarbeitung erforderlich, um die Struktur in eine unveränderliche Form zu bringen (z. B. Serialisierung innerhalb eines Tuples).