为什么 Python ChainMap 中的项目在转换为字典时会颠倒顺序?

bro*_*cla 3 python reverse dictionary

为什么将 ChainMap 转换为字典会颠倒项目的顺序?

这是一个例子。

>>> d = [{'a': 1}, {'b': 2}, {'c': 3}]

>>> ChainMap(*d)
ChainMap({'a': 1}, {'b': 2}, {'c': 3})

>>> dict(ChainMap(*d))
{'c': 3, 'b': 2, 'a': 1}
Run Code Online (Sandbox Code Playgroud)

我可以编写替代代码来组合不反转的字典。

但是,我想了解为什么 ChainMap 会发生这种逆转。

看来保留订单是可取的。

shr*_*ilc 6

ChainMap文档提到

请注意,ChainMap() 的迭代顺序是通过扫描最后到第一个映射来确定的。

关于 ChainMap 这样做的原因的唯一提及似乎是以下内容

这给出了与从最后一个映射开始的一系列 dict.update() 调用相同的顺序

同时,dict从几个版本之前开始保持插入顺序

字典保留插入顺序。请注意,更新密钥不会影响顺序。删除后添加的键将插入到末尾。

3.7 版更改:字典顺序保证为插入顺序。此行为是 CPython 3.6 的实现细节。

因此,当您调用时dict(ChainMap(*d)),它会迭代 ChainMap,即与 和 的顺序相反的顺序*d,这将成为新的插入顺序dict