Python 2.7 与 Python 3.3 中的字典排序:为什么会发生变化?
在 Python 2.7 中,字典键的排序是任意但一致的。然而,这种行为在 Python 3.3 中发生了变化,从 vars() 等方法获取的键的顺序似乎是不确定的。
这种不确定性源于 2012 年实施的安全修复程序,该修复程序默认启用在Python 3.3中。该修复引入了哈希随机化以防止某些安全漏洞。结果,字典和集合的迭代顺序变得不可预测。
在 Python 3.6 中,引入了 dict 类的新实现来保留插入顺序。因此,从 Python 3.7 开始,字典的顺序保留行为现在得到了保证。
某些用例中的意外一致性
尽管顺序是不确定的,但仍有维持一致秩序的情况。例如:
list({str(i): i for i in range(10)}.keys())
在 Python 2.7 和 Python 3.6(及更高版本)中,此表达式一致地产生顺序:
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
这是因为反例使用了集合理解,它创建了一个隐式有序字典。然而,在 Python 3.3 中,由于处理哈希冲突的限制,顺序可能仍然会有所不同。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3