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