为什么2to3会把mydict.keys()改为list(mydict.keys())?

22

我正在查看2to3的输出,其中包括以下更改:

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

输出(output)是一个字典。

这个改变有什么重要性?为什么2to3会这样做?

这个改变如何使代码兼容Python 3?


1
在Python 2和Python 3上尝试使用d.keys()[0] - Padraic Cunningham
请查看此链接:https://dev59.com/YmQn5IYBdhLWcg3wcm57 - Joel
https://www.python.org/dev/peps/pep-3106/ - behzad.nouri
当最佳更改为 for file_prefix in output: 时,但 py2to3 无法猜测。 - Jean-François Fabre
4个回答

24
在 Python 3 中,.keys() 方法返回一个视图对象而不是列表,这样更加高效。在迭代的情况下,这并不重要,但是如果您像这样做 foo.keys()[0] 就会有问题,因为您无法对视图进行索引。因此,2to3 总是添加一个明确的列表转换,以确保任何潜在的索引不会破坏代码。您可以在任何视图能够很好地工作的地方手动删除 list() 调用;2to3 只是无法判断哪种情况属于哪种情况。(请注意,2.x 版本可以调用 iterkeys(),因为它没有索引。)

请点击这里查看相关问题。 - Ed_

3
在Python 2.x中,dict.keys()返回一个list
在Python 3.x中,dict.keys()返回一个视图并且必须传递给list()才能将其转换为list
由于Python 2.x代码不需要一个list,所以应该调用dict.iterkeys()代替。

2
在Python 2中,.keys()返回一个键的列表,但在Python 3中它返回一个非列表迭代器。由于2to3无法知道您是否真正需要将键作为列表,因此它必须谨慎处理并将调用包装在list中,以便您确实获得一个列表。

1
在Python2中,keys返回一个列表,而在Python3中,keys的返回值是一个dict_keys对象。因此,如果你依赖于列表结果的行为,那么需要进行显式转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接