Ab Python 3.6 dict
behält der Standardtyp standardmäßig die Einfügereihenfolge bei.
Definieren
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
führt zu einem Wörterbuch mit den Schlüsseln in der im Quellcode angegebenen Reihenfolge.
Dies wurde erreicht, indem ein einfaches Array mit Ganzzahlen für die Sparse-Hash-Tabelle verwendet wurde, wobei diese Ganzzahlen in ein anderes Array indizieren, in dem die Schlüssel-Wert-Paare (plus den berechneten Hash) gespeichert sind. Dieses letztere Array speichert die Elemente zufällig in der Einfügereihenfolge, und die gesamte Kombination benötigt tatsächlich weniger Speicher als die in Python 3.5 und früher verwendete Implementierung. Weitere Informationen finden Sie im ursprünglichen Ideenbeitrag von Raymond Hettinger .
In 3.6 wurde dies immer noch als Implementierungsdetail betrachtet. finden Sie in dem Was ist neu in Python 3.6 Dokumentation :
Der auftragserhaltende Aspekt dieser neuen Implementierung wird als Implementierungsdetail betrachtet und sollte nicht als verlässlich angesehen werden (dies kann sich in Zukunft ändern, es ist jedoch erwünscht, diese neue Dikt-Implementierung für einige Releases in der Sprache zu haben, bevor die Sprachspezifikation geändert wird Dies trägt auch dazu bei, die Abwärtskompatibilität mit älteren Versionen der Sprache zu gewährleisten, in denen die zufällige Iterationsreihenfolge noch gültig ist (z. B. Python 3.5).
Python 3.7 erweitert dieses Implementierungsdetail auf eine Sprachspezifikation. Daher ist es jetzt obligatorisch, dict
die Reihenfolge in allen Python-Implementierungen beizubehalten, die mit dieser oder einer neueren Version kompatibel sind. Siehe die Erklärung der BDFL .
In bestimmten Fällen möchten Sie die collections.OrderedDict()
Klasse möglicherweise weiterhin verwenden , da sie zusätzlich zum Standardtyp einige zusätzliche Funktionen bietet dict
. B. umkehrbar zu sein (dies erstreckt sich auf die Ansichtsobjekte ) und die Neuordnung zu unterstützen (über die move_to_end()
Methode ).