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 中,由于处理哈希冲突的限制,顺序可能仍然会有所不同。
以上是为什么 Python 2.7 和 3.3 之间的字典排序行为发生变化,以及后来如何演变?的详细内容。更多信息请关注PHP中文网其他相关文章!