Non-Deterministic Ordering of Dictionary Keys in Python 3
In Python 2, the order of dictionary keys was consistent but not guaranteed. However, in Python 3, the ordering of dictionary keys obtained from functions like vars() appears non-deterministic.
Cause of the Non-Determinism
This change is attributed to a security fix implemented in Python 3.3. To prevent predictable hash values, a random seed is used in hash calculations. This randomization results in the unpredictable ordering of dictionary keys.
Preserving Ordering in Python 3.6 and Later
In Python 3.6, a new implementation of dictionaries was introduced that preserves the insertion order by default. From Python 3.7 onward, this behavior is guaranteed by the Python language specification.
Reversing the Non-Determinism
To disable hash randomization and revert to the previous behavior, set the PYTHONHASHSEED environment variable to 0. However, note that this is not advisable for security reasons.
Exception: Set Keys
Unlike dictionaries, sets in Python have always maintained insertion order, regardless of Python version.
Example: Consistent Dictionary Key Ordering
While dictionary keys are non-deterministic in Python 3.3, using sets to convert dictionary keys to strings preserves the order. For example:
<code class="python">set([str(i): i for i in range(10)].keys())</code>
This will consistently return the list ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].
Additional Information
Refer to the object.__hash__() documentation for further details on hash randomization.
The above is the detailed content of Why Is Python 3 Dictionary Key Ordering Non-Deterministic?. For more information, please follow other related articles on the PHP Chinese website!