在Python 3中迭代字典项()、值()、键()

在Python 3中迭代字典项()、值()、键(),python,python-3.x,dictionary,iterator,Python,Python 3.x,Dictionary,Iterator,如果我理解正确的话,在Python 2中,iter(d.keys())与d.iterkeys()是相同的。但是现在,d.keys()是一个视图,它位于列表和迭代器之间。视图和迭代器之间有什么区别 换句话说,在Python3中,它们之间的区别是什么 for k in d.keys() f(k) 及 另外,这些差异是如何在一个简单的for循环(如果有的话)中表现出来的呢?我不确定这是否是对您的问题的一个很好的回答,但希望它能解释一下Python 2和Python 3在这方面的差异 在Pyt

如果我理解正确的话,在Python 2中,
iter(d.keys())
d.iterkeys()
是相同的。但是现在,
d.keys()
是一个视图,它位于列表和迭代器之间。视图和迭代器之间有什么区别

换句话说,在Python3中,它们之间的区别是什么

for k in d.keys()
    f(k)

另外,这些差异是如何在一个简单的
for
循环(如果有的话)中表现出来的呢?

我不确定这是否是对您的问题的一个很好的回答,但希望它能解释一下Python 2和Python 3在这方面的差异

在Python2中,
iter(d.keys())
d.iterkeys()
并不完全相同,尽管它们的行为相同。在第一种情况下,
keys()
将返回字典键列表的副本,
iter
随后将返回该列表上的迭代器对象,而第二种情况下,不会生成完整键列表的副本

Python 3中的
d.keys()
返回的视图对象是可编辑的(也就是说,可以用它们生成迭代器),因此当您在d.keys()中为k说
时,Python将为您创建迭代器。因此,您的两个示例的行为相同

更改
keys()
的返回类型的意义在于Python3视图对象是动态的。i、 e.如果我们说
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'])
python2.x

>>> d = { "first" : 1, "second" : 2 }
>>> ks = d.keys()
>>> ks
['second', 'first']
>>> d["third"] = 3
>>> ks
['second', 'first']
由于Python 3的
keys()
返回动态对象,因此Python 3没有(也不需要)单独的
iterkeys
方法

进一步澄清

在Python3中,
keys()
返回一个
dict\u keys
对象,但如果我们在
for
循环上下文
for k In d.keys()
中使用它,则会隐式创建一个迭代器。因此,d.keys()中k的
与iter(d.keys())
中k的
之间的区别在于迭代器的隐式与显式创建

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

>>> 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 "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
i2=iter(d.keys()) >>>d['fourth']=4 >>>对于i2中的k:打印(k) ... 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 RuntimeError:字典在迭代期间更改了大小

在Python2中,考虑到
键的现有行为,需要一个单独的方法来提供一种在不复制键列表的情况下进行迭代的方法,同时仍然保持向后兼容性。因此,在2.7中有
.viewkeys()

。返回视图。非常感谢。我理解Python 2的
d.keys()
是如何不同的。但是我仍然不清楚Python 2中的
d.iterkeys()
、Python 3中的
d.keys()
和Python 3中的
iter(d.keys())
之间的区别。据我所知,它们都是动态的,没有一个预先构建列表?在
for
循环中,
iter(d.keys())
d.keys()
之间没有区别,就像python内部调用的
iter
一样。Python2.x
d.iterkeys()
和py3k
iter(d.keys())
之间也没有区别:两者都返回字典键迭代器。因此,这三者实际上是相同的。
>>> 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