Python dicts sind sortiert

Python im Gras

Zum Start in diese neue Woche etwas technisches: heute morgen bin ich auf einen Blogartikel gestoßen, in dem es speziell um die Python-Dicts geht. Einer der großen Unterschiede zwischen diesen Datentypen ist bisher, dass die Key-Value-Paare nicht geordnet (also im Sinne der Reihenfolge beim Einfügen) sind. Das war im Grunde auch nicht nötig, weil die Domäne von Dicts, also Hash Maps, eine andere ist als bei (Linked) Lists. Dicts sind nämlich eher wie Lookup-Tables, bei denen es nicht auf die Reihenfolge des Einfügens ankommt. Nun, dieses Verhalten hat sich aber mittlerweile geändert:

the insertion-order preservation nature of dict objects has been declared to be an official part of the Python language spec

(vgl. What's new in Python 3.7)

Changed in version 3.7: Dictionary order is guaranteed to be insertion order. This behavior was an implementation detail of CPython from 3.6.

(vgl. Built-in types - Python Documentation)

Hintergrund ist, dass die Hash Map nun nicht mehr direkt auf die Values zeigt, sondern lediglich auf Indizes für ein Array, in dem die Values abgelegt werden. Da dieses Array naturgemäß sequentiell angelegt wird, ist somit die Reihenfolge bewahrt. Hinter dem Dict steckt nun also in der C-Implementierung nicht mehr nur eine Hash Map, sondern auch ein Array.

Nun, eigentlich wurde diese Änderung in CPython 3.6 vollzogen und in Python 3.7 manifestiert, aber die Änderung lief eher im Hintergrund ab. Damit einher geht natürlich der Vorteil, dass nun zuverlässig über dicts und ihre Itmes iteriert werden kann, ohne, dass auf Garantien über die Reihenfolge verzichtet werden muss. Zuvor war das nur dem OrderedDict vorbehalten. Zudem wird dank PEP 468 ebenfalls die Reihenfolge der kwargs gewahrt.

Keine Kommentare

Kommentar verfassen