„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum hat sich das Sortierverhalten des Wörterbuchs zwischen Python 2.7 und 3.3 geändert und wie hat es sich später weiterentwickelt?

Warum hat sich das Sortierverhalten des Wörterbuchs zwischen Python 2.7 und 3.3 geändert und wie hat es sich später weiterentwickelt?

Veröffentlicht am 02.11.2024
Durchsuche:266

Why Did the Dictionary Ordering Behavior Change Between Python 2.7 and 3.3, and How Did It Evolve Later?

Wörterbuchreihenfolge in Python 2.7 vs. Python 3.3: Warum die Änderung?

In Python 2.7 war die Reihenfolge der Wörterbuchschlüssel willkürlich, aber konsistent . Dieses Verhalten hat sich jedoch in Python 3.3 geändert, wo die Reihenfolge der von Methoden wie vars() erhaltenen Schlüssel nicht deterministisch erscheint.

Dieser Nichtdeterminismus ist auf einen 2012 implementierten Sicherheitsfix zurückzuführen, der standardmäßig aktiviert war in Python 3.3. Mit dem Fix wurde eine Hash-Randomisierung eingeführt, um bestimmte Sicherheitslücken zu vermeiden. Dadurch wurde die Iterationsreihenfolge von Wörterbüchern und Mengen unvorhersehbar.

In Python 3.6 wurde eine neue Implementierung für die Klasse dict eingeführt, die die Einfügereihenfolge beibehält. Folglich ist ab Python 3.7 nun ein reihenfolgeerhaltendes Verhalten für Wörterbücher garantiert.

Unerwartete Konsistenz in bestimmten Anwendungsfällen

Trotz der nicht deterministischen Reihenfolge gibt es solche Fälle, in denen eine konsistente Reihenfolge aufrechterhalten wird. Zum Beispiel:

list({str(i): i for i in range(10)}.keys())

In Python 2.7 und Python 3.6 (und höher) dieser Ausdruck erzeugt konsistent die Reihenfolge:

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

Das liegt daran, dass das Gegenbeispiel ein Mengenverständnis verwendet, das ein implizit geordnetes Wörterbuch erstellt. In Python 3.3 kann die Reihenfolge jedoch aufgrund der Einschränkungen bei der Handhabung von Hash-Kollisionen noch variieren.

Freigabeerklärung Dieser Artikel wird unter folgender Adresse reproduziert: 1729494555 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3