协慌网

登录 贡献 社区

Python2 中的 dict.items()和 dict.iteritems()有什么区别?

dict.items()dict.iteritems()之间是否有适用的区别?

Python 文档中

dict.items() :返回字典的(键,值)对列表的副本。

dict.iteritems() :返回字典(键,值)对上的迭代器。

如果我运行下面的代码,则每个代码似乎都返回对同一对象的引用。我缺少任何细微的差异吗?

#!/usr/bin/python

d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
   if d[k] is v: print '\tthey are the same object' 
   else: print '\tthey are different'

print 'd.iteritems():'   
for k,v in d.iteritems():
   if d[k] is v: print '\tthey are the same object' 
   else: print '\tthey are different'

输出:

d.items():
    they are the same object
    they are the same object
    they are the same object
d.iteritems():
    they are the same object
    they are the same object
    they are the same object

答案

这是演变的一部分。

最初,Python items()构建了一个真正的元组列表,并将其返回。这可能会占用大量额外的内存。

然后,一般将生成器引入该语言,然后将该方法重新实现为名为iteritems()的迭代器 - 生成器方法。保留原件是为了向后兼容。

Python 3 的更改之一是items()现在返回视图,并且list从未完全构建。 iteritems()方法也消失了,因为 Python 3 中的items()就像 Python 2.7 中的viewitems()

dict.items()返回 2 元组的列表( [(key, value), (key, value), ...] ),而dict.iteritems()是生成 2 元组的生成器。前者最初占用更多空间和时间,但是访问每个元素的速度很快,而前者最初占用较少的空间和时间,但是在生成每个元素时要花费更多的时间。

在 Py2.x 中

命令dict.items() dict.keys()dict.values()返回的字典的列表副本(k, v)对,键和值。如果复制的列表很大,这可能会占用大量内存。

命令dict.iteritems()dict.iterkeys()dict.itervalues()返回在字典的(k, v)对,键和值上进行迭代的迭代器。

命令dict.viewitems()dict.viewkeys()dict.viewvalues()返回视图对象,这些视图对象可以反映字典的更改。 (即,如果你del的项或添加一个(k,v)在词典对中,视图对象可在同一时间自动地改变。)

$ python2.7

>>> d = {'one':1, 'two':2}
>>> type(d.items())
<type 'list'>
>>> type(d.keys())
<type 'list'>
>>> 
>>> 
>>> type(d.iteritems())
<type 'dictionary-itemiterator'>
>>> type(d.iterkeys())
<type 'dictionary-keyiterator'>
>>> 
>>> 
>>> type(d.viewitems())
<type 'dict_items'>
>>> type(d.viewkeys())
<type 'dict_keys'>

在 Py3.x 中

在 Py3.x 中,情况更加清晰了,因为只有dict.items()dict.keys()dict.values()可用,它们返回视图对象的方式dict.viewitems()相同。

就像 @lvc 指出的那样, view 对象iterator 不同,因此,如果要在 Py3.x 中返回迭代器iter(dictview)

$ python3.3

>>> d = {'one':'1', 'two':'2'}
>>> type(d.items())
<class 'dict_items'>
>>>
>>> type(d.keys())
<class 'dict_keys'>
>>>
>>>
>>> ii = iter(d.items())
>>> type(ii)
<class 'dict_itemiterator'>
>>>
>>> ik = iter(d.keys())
>>> type(ik)
<class 'dict_keyiterator'>