dict.items()
和dict.iteritems()
之间是否有适用的区别?
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 元组的生成器。前者最初占用更多空间和时间,但是访问每个元素的速度很快,而前者最初占用较少的空间和时间,但是在生成每个元素时要花费更多的时间。
命令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 中,情况更加清晰了,因为只有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'>