Nichtdeterministische Reihenfolge der Wörterbuchschlüssel in Python 3
In Python 2 war die Reihenfolge der Wörterbuchschlüssel konsistent, aber nicht garantiert. Allerdings scheint in Python 3 die Reihenfolge der Wörterbuchschlüssel, die von Funktionen wie vars() erhalten werden, nicht deterministisch zu sein.
Ursache des Nichtdeterminismus
Diese Änderung ist wird auf einen in Python 3.3 implementierten Sicherheitsupdate zurückgeführt. Um vorhersehbare Hash-Werte zu verhindern, wird bei Hash-Berechnungen ein zufälliger Startwert verwendet. Diese Randomisierung führt zu einer unvorhersehbaren Reihenfolge der Wörterbuchschlüssel.
Bewahrung der Reihenfolge in Python 3.6 und höher
In Python 3.6 wurde eine neue Implementierung von Wörterbüchern eingeführt, die die beibehält Die Einfügereihenfolge wird standardmäßig festgelegt. Ab Python 3.7 wird dieses Verhalten durch die Python-Sprachspezifikation garantiert.
Umkehrung des Nichtdeterminismus
Um die Hash-Randomisierung zu deaktivieren und zum vorherigen Verhalten zurückzukehren, legen Sie fest Setzen Sie die Umgebungsvariable PYTHONHASHSEED auf 0. Beachten Sie jedoch, dass dies aus Sicherheitsgründen nicht ratsam ist.
Ausnahme: Schlüssel festlegen
Im Gegensatz zu Wörterbüchern werden Mengen in Python immer beibehalten Einfügereihenfolge, unabhängig von der Python-Version.
Beispiel: Konsistente Reihenfolge der Wörterbuchschlüssel
Während Wörterbuchschlüssel in Python 3.3 nicht deterministisch sind, werden Wörterbuchschlüssel mithilfe von Sätzen konvertiert strings behält die Reihenfolge bei. Zum Beispiel:
<code class="python">set([str(i): i for i in range(10)].keys())</code>
Dies gibt konsistent die Liste ['0', '1', '2', '3', '4', '5', '6', '7' zurück. , '8', '9'].
Zusätzliche Informationen
Weitere Details zur Hash-Randomisierung finden Sie in der Dokumentation zu object.__hash__().
Das obige ist der detaillierte Inhalt vonWarum ist die Reihenfolge der Python 3-Wörterbuchschlüssel nicht deterministisch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!