【问题标题】:Are dictionaries ordered in Python 3.6+?字典是在 Python 3.6+ 中排序的吗?
【发布时间】:2023-04-05 21:31:01
【问题描述】:

字典在 Python 3.6 中排序(至少在 CPython 实现下)与以前的版本不同。这似乎是一个重大变化,但它只是documentation 中的一小段。它被描述为 CPython 实现细节而不是语言特性,但也暗示这可能在未来成为标准。

在保留元素顺序的同时,新的字典实现如何比旧的实现更好?

这是文档中的文本:

dict() 现在使用“紧凑”表示 pioneered by PyPy。与 Python 3.5 相比,新 dict() 的内存使用量减少了 20% 到 25%。 PEP 468(在函数中保留 **kwargs 的顺序。)由此实现。这个新实现的顺序保留方面被认为是一个实现细节,不应依赖(这可能会在未来发生变化,但在更改语言规范之前,希望在几个版本中使用该语言的这个新 dict 实现为所有当前和未来的 Python 实现强制要求保持顺序的语义;这也有助于保持与随机迭代顺序仍然有效的旧版本语言的向后兼容性,例如 Python 3.5)。 (由 INADA Naoki 在issue 27350 提供。想法originally suggested by Raymond Hettinger。)

2017 年 12 月更新:对于 Python 3.7,dicts 保留插入顺序为 guaranteed

【问题讨论】:

  • 在 Python-Dev 邮件列表中查看此线程:mail.python.org/pipermail/python-dev/2016-September/146327.html 如果您还没有看到它;它基本上是围绕这些主题进行的讨论。
  • 如果现在应该对 kwargs 进行排序(这是个好主意)并且 kwargs 是 dict,而不是 OrderedDict,那么我想人们可以假设 dict 键将在 Python 的未来版本中保持有序,尽管文档另有说明。
  • @DmitriySintsov 不,不要做这样的假设。这是在编写 PEP 期间提出的一个问题,该 PEP 定义了 **kwargs 的顺序保留功能,因此使用的措辞是外交的:现在保证函数签名中的 **kwargs 是插入顺序-保留映射。他们使用术语 mapping 是为了不强制任何其他实现使 dict 有序(并在内部使用OrderedDict)并作为一种表示这不应该依赖的方式事实上,dict 没有被订购。
  • 来自 Raymond Hettinger 的好 video explanation
  • @wazoox,hashmap 的顺序和复杂性没有改变。该更改通过浪费更少的空间使哈希图更小,并且节省的空间(通常?)比辅助数组占用的空间多。更快、更小、更有序 - 您可以选择所有 3 个。

标签:
python
python-3.x
dictionary
python-internals
python-3.6