CPython是否保证dict.keys与dict.values具有相同的顺序?

时间:2014-10-15 15:15:32

标签: python cpython

CPython是否保证dict.keys()与未经修改的词典中的dict.values()具有相同的顺序?

换句话说,是否总是如此:

list(d.items()) == list(zip(d.keys(), d.values()))

The docs说:

  

键和值以任意顺序列出   [...]如果调用items(),keys(),values(),iteritems(),iterkeys()和itervalues()而没有对字典进行干预修改,则列表将直接对应。

但是,CPython源代码建议不然。 implementation of dict.items() in dictobject.c

/* Preallocate the list of tuples, to avoid allocations during
 * the loop over the items, which could trigger GC, which
 * could resize the dict. :-(
 */

那么,未经修改的dict上的dict.keys()dict.values()是否总是以相同的顺序返回项目?即使GC运行了吗?

如果是真的,这只适用于CPython,还是只适用于Python 2?

1 个答案:

答案 0 :(得分:2)

是的,它仍然是,因为dict.keys()dict.values() 不需要分配新对象。您将获得一个列表对象,分别引用现有的键或值对象。

另一方面,dict.items()需要创建元组对象来保存键值对。因此,评论。

请注意,运行GC 本身不会调整字典大小;只有当键的空间不足时,才会调整dicitonaries的大小。但是触发GC可以触发一个__del__处理程序,它可以添加到字典中,可以调整大小。所以可能性触发了其他Python代码,可能会改变字典在这里被阻止了。