为什么在python中迭代字典时需要调用.iteritems()?

为什么你必须调用iteritems()来迭代字典中的键值对呢? 即

 dic = {'one':'1', 'two':'2'} for k, v in dic.iteritems(): print k, v 

为什么不是迭代字典的默认行为

 for k, v in dic: print k, v 

对于每个python容器C,期望是这样的

 for item in C: assert item in C 

会传递得很好 – 如果(循环语句)中的某种意义与另一个意义(存在检查)有完全不同的意义, 会不会觉得奇怪? 我当然会! 它自然适用于列表,集合,元组,…

所以,当C是一个字典时,如果in for循环中产生键/值元组,那么,根据最less惊讶的原则, in遏制检查中也将不得不将这样一个元组作为它的左手操作数。

那有多好? 相当无用的,基本上使if (key, value) in C的同义词if C.get(key) == value – 这是一个检查,我相信我可能已经执行,或想要执行, if k in C实际上意味着什么 ,只检查密钥的存在而完全忽略这个值。

另一方面,想要在键上循环是相当普遍的,例如:

 for k in thedict: thedict[k] += 1 

具有这个价值也无济于事:

 for k, v in thedict.items(): thedict[k] = v + 1 

实际上有点不太清晰,简洁。 (请注意, items是用于获取键/值对的“正确”方法的原始拼写:不幸的是,当这样的访问器返回整个列表的时候,所以为了支持“只是迭代”替代拼写必须是在Python 3中,与之前Python版本的向后兼容性约束被大大削弱了,它又变成了items )。

我的猜测:使用完整的元组将会更直观地进行循环,但是对于使用in成员进行testing可能更less。

 if key in counts: counts[key] += 1 else: counts[key] = 1 

如果您必须为in指定键和值,那么该代码将不会真正起作用。 我很难想象使用情况,你会检查是否在字典中的关键AND值。 仅testing按键就更自然了。

 # When would you ever write a condition like this? if (key, value) in dict: 

现在运营商和运营商不需要对相同的项目for ... in操作。 实施方面,他们是不同的操作( __contains____iter__ )。 但是,这种小小的不一致性会让人感到困惑,而且是不一致的。