Почему порядок словаря недетерминирован?

Недавно я перешел с 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']

Ответы на вопрос(2)

Ваш ответ на вопрос