Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist die Reihenfolge der Python 3-Wörterbuchschlüssel nicht deterministisch?

Warum ist die Reihenfolge der Python 3-Wörterbuchschlüssel nicht deterministisch?

Barbara Streisand
Barbara StreisandOriginal
2024-10-21 15:07:301000Durchsuche

Why Is Python 3 Dictionary Key Ordering Non-Deterministic?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn