我不知道这是否是对你的问题的答案,但希望它解释了一点关于Python 2和3在这方面的区别。
在Python 2中,iter(d.keys())和d.iterkeys()不完全等同,尽管它们的行为相同。在第一个,keys()将返回字典的键列表的副本,然后iter将返回一个迭代器对象在此列表,第二个完整的键列表的副本永远不会被构建。
Python 3中d.keys()返回的视图对象是可迭代的(即可以从中创建一个迭代器),所以当你在d.keys()中为k指定时,Python会为你创建迭代器。因此,你的两个例子将表现相同。
更改keys()的返回类型的重要性是Python 3视图对象是动态的。即如果我们说ks = d.keys()并且稍后添加到d,则ks将反映这一点。在Python 2中,keys()返回当前在dict中的所有键的列表。比较:
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()返回动态对象,Python 3没有(并且不需要)单独的iterkeys方法。
进一步澄清
在Python 3中,keys()返回一个dict_keys对象,但是如果我们在for循环上下文中使用它在d.keys()中的k,则隐式创建一个迭代器。因此,d.keys()中的k和iter(d.keys())中的k之间的差异是迭代器的隐式和显式创建之一。
在另一个区别,虽然他们都是动态的,请记住,如果我们创建一个显式迭代器,那么它只能使用一次,而视图可以根据需要重用。例如
>>> 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
另外,请注意,如果我们创建一个显式迭代器,然后修改dict,则迭代器无效:
>>> 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中,给定键的现有行为,需要一个单独的方法来提供一种迭代方法,而不复制键列表,同时仍保持向后兼容性。因此iterkeys()