Por que o ordenamento de dicionários não é determinístico?
Eu mudei recentemente do Python 2.7 para o Python 3.3, e parece que enquanto no Python 2 a ordenação das chaves do dicionário era arbitrária mas consistente, no Python 3 a ordenação das chaves de um dicionário obtido com, por exemplo,vars()
parece não determinista.
Se eu corro:
class Test(object): pass
parameters = vars(Test)
print(list(parameters.keys()))
tanto no Python 2.7 como no Python 3.3, então:
Python 2.7 consistentemente me dá
['__dict__', '__module__', '__weakref__', '__doc__']
Com o Python 3.3, posso obter qualquer ordem aleatória - por exemplo:
['__weakref__', '__module__', '__qualname__', '__doc__', '__dict__']
['__doc__', '__dict__', '__qualname__', '__module__', '__weakref__']
['__dict__', '__module__', '__qualname__', '__weakref__', '__doc__']
['__weakref__', '__doc__', '__qualname__', '__dict__', '__module__']
De onde vem esse não-determinismo? E porque é algo como
list({str(i): i for i in range(10)}.keys())
… Consistente entre as corridas, sempre dando
['3', '2', '1', '0', '7', '6', '5', '4', '9', '8']
…?