在Python 3中,许多字典方法的行为与Python 2完全不同,并且许多字典方法也都被删除了has_key,iter*并且view*消失了。现在必须使用代替长期不推荐使用的。d.has_key(key)key in d
在Python 2,字典方法keys,values并items返回列表。在Python 3中,它们返回视图对象。视图对象不是迭代器,它们在两个方面与它们不同,即:
它们有大小(可以len在其上使用该功能)
它们可以多次迭代
此外,与迭代器一样,字典中的更改也会反映在视图对象中。
Python 2.7已从Python 3向后移植了这些方法。他们可以作为viewkeys,viewvalues和viewitems。要将Python 2代码转换为Python 3代码,相应的形式为:
d.keys(),并且Python 2的应该更改为,并且d.values()d.items()list(d.keys())list(d.values())list(d.items())
d.iterkeys(),而应改为,甚至更好,; 和分别d.itervalues()d.iteritems()iter(d.keys())iter(d)iter(d.values())iter(d.items())
最后的Python 2.7的方法调用,并且可以被替换,而。d.viewkeys()d.viewvalues()d.viewitems()d.keys()d.values()d.items()
移植在字典键,值或项目上进行迭代而又对其进行突变的Python 2代码有时很棘手。考虑:
d = {'a': 0, 'b': 1, 'c': 2, '!': 3} for key in d.keys(): if key.isalpha(): del d[key]
该代码看起来好像在Python 3中可以类似地工作,但是该keys方法返回一个视图对象,而不是列表,并且如果字典在迭代时更改大小,则Python 3代码将崩溃RuntimeError: dictionary changed size during iteration。解决方案当然是正确编写。for key in list(d)
类似地,视图对象的行为与迭代器不同:一个不能next()在其上使用,一个不能恢复迭代。它会重新启动;如果Python 2的代码传递的返回值,或者给需要的迭代器,而不是一个一个方法可迭代,那么应,或在Python 3。d.iterkeys()d.itervalues()d.iteritems()iter(d)iter(d.values())iter(d.items())