Недавно я переключился с 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']
...?