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?
答案 0 :(得分:2)
是的,它仍然是,因为dict.keys()
和dict.values()
不需要分配新对象。您将获得一个列表对象,分别引用现有的键或值对象。
另一方面,dict.items()
需要创建元组对象来保存键值对。因此,评论。
请注意,运行GC 本身不会调整字典大小;只有当新键的空间不足时,才会调整dicitonaries的大小。但是触发GC可以触发一个__del__
处理程序,它可以添加到字典中,可以调整大小。所以可能性触发了其他Python代码,可能会改变字典在这里被阻止了。