现在是否订购了词典?

时间:2017-06-11 12:35:01

标签: python python-3.x data-structures

我是编程的新手,但我一直在深入研究,现在我正在学习一本名为Head First Python的书。它说字典是可变的,但无序的数据结构,无论何时返回或打印所述数据结构,键/值对将保持不变,但它们出现的顺序不会。

然而,我注意到在无数次运行IDLE时,每次返回或打印字典时,它都会以最初生成或通过循环生成/迭代的完全相同的顺序出现。这可能是Python 2和Python 3之间的区别吗?这是一个新的更新吗?它可能只是IDE吗?这并不重要,但我对答案非常感兴趣。

1 个答案:

答案 0 :(得分:3)

在Python 3.6中,Python字典的实现得到了更新,使它们的内存效率更高。作为这项工作的副作用,他们现在也保留了插入顺序。

这仍然被认为是一个实施细节;未来版本的Python 可能强制要求dict保留订单。请参阅What's New in Python 3.6 documentation

  

这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖(这可能会在未来发生变化,但是希望在更改之前在几个版本的语言中使用这个新的dict实现所有当前和未来Python实现都要求命令保留语义的语言规范;这也有助于保持与随机迭代顺序仍然生效的语言的旧版本的向后兼容性,例如Python 3.5)。

如果您不使用Python 3.6(或更新版本),并查看看似有序的键序列,那么您正在考虑巧合。用作键的整数通常看起来是有序的,因为它们的哈希值与整数的值有直接关系(对于除一个边缘情况以外的所有情况,1对1),导致它们在同一个时隙中插入如果您有小整数,请订购:

>>> import sys
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=13, releaselevel='final', serial=0)
>>> {1: 'foo', 3: 'bar', 5: 'spam'}
{1: 'foo', 3: 'bar', 5: 'spam'}

请参阅Why is the order in dictionaries and sets arbitrary?,了解其工作原理的简短概述。

Python 3.7已将此实现细节提升为 Python语言规范。这意味着语言的所有兼容实现 必须保留词典中的插入顺序。