【问题标题】:Why does 2to3 change mydict.keys() to list(mydict.keys())?为什么 2to3 将 mydict.keys() 更改为 list(mydict.keys())?
【发布时间】:2014-12-15 01:13:20
【问题描述】:

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

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

output 是字典。

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

此更改如何使代码与 Python 3 兼容?

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-04
          • 2013-11-13
          • 1970-01-01
          • 2022-01-24
          相关资源
          最近更新 更多