20

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

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

output字典在哪里。

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

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

4

4 回答 4

21

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

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

您可以在视图可以正常工作的任何地方手动删除list()调用;2to3只是不够聪明,无法判断哪种情况是哪种情况。

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

于 2014-12-15T01:15:53.690 回答
3

在 Python 2.x 中,dict.keys()返回一个list.

在 Python 3.x 中,dict.keys()返回一个视图并且必须传递给list()它才能使其成为list.

由于 Python 2.x 代码不需要 alist它应该调用它dict.iterkeys()

于 2014-12-15T01:16:27.027 回答
2

在 Python 2 中,.keys()返回一个键列表,但在 Python 3 中,它返回一个非列表迭代器。由于 2to3 无法知道您是否真的需要将键作为列表,所以它必须谨慎行事并将调用包含在内,list以便您真正得到一个列表。

于 2014-12-15T01:16:01.157 回答
1

在 Python2 中,keys返回一个列表,而在 3 中,返回的keys是一个dict_keys对象。因此,如果您依赖于列表结果行为,则显式转换是必要的。

于 2014-12-15T01:16:16.257 回答