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代码的可能性可能会更改此处阻止的词典。