字典方法更改
在 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 代码,相应的表单是:
- Python 2 的
d.keys()
,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 代码将 d.iterkeys()
,d.itervalues()
或 d.iteritems()
的返回值传递给期望迭代器而不是迭代的方法,则 Python 3 中应该是 iter(d)
,iter(d.values())
或 iter(d.items())
。