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

Pra*_*tic 9 python python-2to3 python-3.x

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

-            for file_prefix in output.keys():
+            for file_prefix in list(output.keys()):
Run Code Online (Sandbox Code Playgroud)

哪里output是字典.

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

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

Amb*_*ber 13

在Python 3 .keys()中,为了效率,该方法返回视图对象而不是列表.

在迭代的情况下,这实际上并不重要,但重要的是如果你做的事情foo.keys()[0]- 你不能索引视图.因此,2to3始终添加显式列表转换以确保任何潜在的索引不会中断.

您可以list()在视图正常工作的任何地方手动删除呼叫; 2to3只是不够聪明,无法分辨哪种情况.

(请注意,2.x版本可以调用iterkeys(),因为它没有索引.)