我最近从Python2.7切换到Python3.3,似乎在Python2中,字典键的顺序是任意的,但是是一致的,在Python3中,用^{
如果我跑:
class Test(object): pass
parameters = vars(Test)
print(list(parameters.keys()))
在Python2.7和Python3.3中,然后:
Python 2.7一直给我
['__dict__', '__module__', '__weakref__', '__doc__']
使用Python3.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']
?
更新:在Python 3.6中,
dict
有一个保持插入顺序的new implementation。在Python 3.7中,这种保序行为是guaranteed:这是2012年的security fix结果,在Python 3.3中是enabled by default(向下滚动到“安全改进”)。
从公告中:
如上所述,最后一个大写的位在Python3.3中不再正确。
另请参见:^{} documentation (“注意”侧边栏)。
如果绝对必要,可以通过将^{} 环境变量设置为
0
,在受此行为影响的Python版本中禁用散列随机化。你的反例:
…在Python 3.3中,不实际上总是给出相同的结果,尽管不同顺序的数量是有限的due to处理散列冲突的方式:
如本答案开头所述,Python3.6不再是这样:
请注意,Python3.7仍然有不确定的集合。dict保留插入顺序,但set不保留。集合可以表现出相同的随机行为。
python3 -c "print({str(i) for i in range(9)})"
每次跑步都会有不同的结果。
相关问题 更多 >
编程相关推荐