Почему порядок словаря недетерминирован?
Недавно я перешел с Python 2.7 на Python 3.3, и кажется, что, хотя в Python 2 упорядочение ключей словаря было произвольным, но последовательным, в Python 3 упорядочение ключей словаря было получено, например, с помощью.vars()
кажется недетерминированным.
Если я бегу:
class Test(object): pass
parameters = vars(Test)
print(list(parameters.keys()))
в обоих Python 2.7 и Python 3.3, затем:
Python 2.7 постоянно дает мне
['__dict__', '__module__', '__weakref__', '__doc__']
С Python 3.3 я могу получить любой случайный порядок - например:
['__weakref__', '__module__', '__qualname__', '__doc__', '__dict__']
['__doc__', '__dict__', '__qualname__', '__module__', '__weakref__']
['__dict__', '__module__', '__qualname__', '__weakref__', '__doc__']
['__weakref__', '__doc__', '__qualname__', '__dict__', '__module__']
Откуда этот недетерминизм? И почему что-то вроде ...
list({str(i): i for i in range(10)}.keys())
соответствует между пробегами, всегда давая ...?
['3', '2', '1', '0', '7', '6', '5', '4', '9', '8']