我正在查看2to3中包含此更改的输出:
- for file_prefix in output.keys():
+ for file_prefix in list(output.keys()):
其中output
是字典。
这种变化有什么意义?为什么2to3会这样做?
这种变化如何使代码Python 3兼容?
答案 0 :(得分:11)
在Python 3中,.keys()
方法返回视图对象而不是列表,以提高效率。
在迭代的情况下,这实际上并不重要,但重要的是你在做foo.keys()[0]
这样的事情 - 你不能索引视图。因此,2to3
始终添加显式列表转换,以确保任何潜在的索引不会中断。
您可以在视图正常工作的任何地方手动删除list()
来电; 2to3
只是不够聪明,不知道哪个案例是哪个。
(请注意,2.x版本可以调用iterkeys()
,因为它没有索引。)
答案 1 :(得分:3)
在Python 2.x中,dict.keys()
会返回list
。
在Python 3.x中,dict.keys()
返回一个视图,必须传递给list()
才能使其成为list
。
由于Python 2.x代码不需要list
,因此应该调用dict.iterkeys()
。
答案 2 :(得分:1)
在Python 2中,.keys()
返回键的列表,但在Python 3中它返回一个非列表迭代器。由于2to3不知道你是否真的需要密钥作为列表,因此必须小心谨慎并将呼叫包裹在list
中,这样你才真正得到一个列表。
答案 3 :(得分:1)
在Python2中,keys
返回了一个列表,而在{3}中keys
的返回是一个dict_keys
对象。因此,如果您依赖于列表结果行为,则必须进行显式转换。