在 Python 3 中迭代字典 items()、values()、keys()

如果我理解正确,在 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循环中显示出来(如果有的话)?

已邀请:
d.keys()Python 3 中返回的视图对象是可迭代的(即可以从它们for k in d.keys()生成迭代器),因此当您说Python 会为您创建迭代器。因此,您的两个示例的行为相同。

返回类型变化的意义在于keys()Python 3 视图对象是动态的。即如果我们说ks = d.keys()然后添加到d然后ks将反映这一点。在 Python 2 中,keys()返回当前在 dict 中的所有键的列表。比较:

蟒蛇 3

>>> d = { "first" : 1, "second" : 2 }
>>> ks = d.keys()
>>> ks
dict_keys(['second', 'first'])
>>> d["third"] = 3
>>> ks
dict_keys(['second', 'third', 'first'])

当 Python 3keys()返回动态对象时,Python 3 没有(也不需要)单独的iterkeys方法。

进一步澄清

在 Python 3 中,keys()返回一个dict_keys对象,但如果我们在for循环上下文中使用它,for k in d.keys()则会隐式创建一个迭代器。所以之间的区别for k in d.keys()和for k in iter(d.keys())隐含对明确创建迭代器之一。

就另一个区别而言,虽然它们都是动态的,但请记住,如果我们创建了一个显式迭代器,那么它只能使用一次,而视图可以根据需要重用。例如

>>> 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
另外,请注意,如果我们创建一个显式迭代器,然后修改字典,则迭代器将失效:

>>> i2 = iter(d.keys())
>>> d['fourth'] = 4
>>> for k in i2: print(k)
...
Traceback (most recent call last):
File "", line 1, in
RuntimeError: dictionary changed size during iteration
在 Python 2 中,考虑到keys单独方法的现有行为,需要提供一种无需复制键列表的迭代方法,同时仍保持向后兼容性。因此iterkeys()

要回复问题请先登录注册