Python字典方法变更

示例

在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())