在Python 3中迭代字典项(),值(),键()
如果我理解正确,在Python 2中, iter(d.keys())
与d.iterkeys()
相同。 但现在, d.keys()
是一个视图,位于列表和迭代器之间。 视图和迭代器有什么区别?
换句话说,在Python 3中,有什么区别呢
for k in d.keys() f(k)
和
for k in iter(d.keys()) f(k)
另外,这些差异如何在一个简单for
循环中显示(如果有的话)?
我不确定这是不是你的问题的答案,但希望能解释一下Python 2和Python 3在这方面的区别。
在Python 2中, iter(d.keys())
和d.iterkeys()
并不完全等价,尽pipe它们的行为相同。 首先, keys()
将返回字典的键列表副本,然后iter
将返回一个迭代器对象在这个列表中,第二个键完整列表的副本将永远不会build立。
Python 3中由d.keys()
返回的视图对象是可迭代的 (也就是说可以由它们for k in d.keys()
一个迭代器),所以当你for k in d.keys()
Python将为你创build迭代器。 因此,你的两个例子将performance相同。
keys()
的返回types改变的意义在于Python 3视图对象是dynamic的。 即如果我们说ks = d.keys()
,然后添加到d
然后ks
将反映这一点。 在Python 2中, keys()
返回字典中当前所有键的列表。 比较:
Python 3
>>> d = { "first" : 1, "second" : 2 } >>> ks = d.keys() >>> ks dict_keys(['second', 'first']) >>> d["third"] = 3 >>> ks dict_keys(['second', 'third', 'first'])
Python 2.x
>>> d = { "first" : 1, "second" : 2 } >>> ks = d.keys() >>> ks ['second', 'first'] >>> d["third"] = 3 >>> ks ['second', 'first']
由于Python 3的keys()
返回dynamic对象,Python 3没有(也没有必要)单独的iterkeys
方法。
进一步澄清
在Python 3中, keys()
返回一个dict_keys
对象,但是如果我们for k in d.keys()
的for
循环上下文中使用它,那么隐式地创build一个迭代器。 所以for k in d.keys()
for k in iter(d.keys())
和for k in iter(d.keys())
之间的区别是迭代器的隐式与显式创build之间的区别。
就另一个区别而言,虽然它们都是dynamic的,但请记住,如果我们创build一个显式迭代器,那么它只能使用一次,而视图可以根据需要重用。 例如
>>> ks = d.keys() >>> 'first' in ks True >>> 'second' in ks True >>> i = iter(d.keys()) >>> 'first' in i True >>> 'second' in i False # because we've already reached the end of the iterator
另外,请注意,如果我们创build一个显式迭代器,然后修改字典,那么迭代器将失效:
>>> i2 = iter(d.keys()) >>> d['fourth'] = 4 >>> for k in i2: print(k) ... Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: dictionary changed size during iteration
在Python 2中,考虑到keys
的现有行为,需要单独的方法来提供迭代的方式而不复制键的列表,同时仍保持向下兼容性。 因此iterkeys()