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



CPython是否保证dict.keys()在未修改的dict上具有与dict.values()相同的顺序?

换句话说,总是真的吗

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

医生说:

键和值按任意顺序列出[…]如果调用items()、key()、values(),itertimes()、iterkeys()和itervalues()时没有对字典进行任何干预修改,则列表将直接对应。

然而,CPython源代码却提出了相反的建议。dictobject.c:中dict.items()的实现

/* 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,还是只适用于Python2?

是的,这仍然是真的,因为dict.keys()dict.values()不需要分配新对象。您会得到一个列表对象,其中分别引用了现有的键或值对象。

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

请注意,运行GC本身不会调整字典的大小;只有当键的空间用完时,才会调整骰子的大小。但是触发GC可以触发__del__处理程序,该处理程序可以添加到字典中,该字典可以调整大小。。因此,触发其他Python代码的可能性可能会更改此处阻止的词典。

最新更新