为什么2to3将mydict.keys()更改为list(mydict.keys())?

时间:2014-12-15 01:13:21

标签: python python-3.x python-2to3

我正在查看2to3中包含此更改的输出:

-            for file_prefix in output.keys():
+            for file_prefix in list(output.keys()):

其中output是字典。

这种变化有什么意义?为什么2to3会这样做?

这种变化如何使代码Python 3兼容?

4 个答案:

答案 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对象。因此,如果您依赖于列表结果行为,则必须进行显式转换。