我正在查看包含此更改的 2to3 的输出:
- for file_prefix in output.keys():
+ for file_prefix in list(output.keys()):
output
字典在哪里。
这种变化有什么意义?为什么2to3会这样做?
这种变化如何使代码与 Python 3 兼容?
我正在查看包含此更改的 2to3 的输出:
- for file_prefix in output.keys():
+ for file_prefix in list(output.keys()):
output
字典在哪里。
这种变化有什么意义?为什么2to3会这样做?
这种变化如何使代码与 Python 3 兼容?
在 Python 3.keys()
中,为了提高效率,该方法返回视图对象而不是列表。
在迭代的情况下,这实际上并不重要,但重要的是如果你正在做类似的事情foo.keys()[0]
- 你不能索引视图。因此,2to3
始终添加显式列表转换以确保任何潜在的索引都不会中断。
您可以在视图可以正常工作的任何地方手动删除list()
调用;2to3
只是不够聪明,无法判断哪种情况是哪种情况。
(请注意,2.x 版本可以调用iterkeys()
,因为它不是索引。)
在 Python 2.x 中,dict.keys()
返回一个list
.
在 Python 3.x 中,dict.keys()
返回一个视图并且必须传递给list()
它才能使其成为list
.
由于 Python 2.x 代码不需要 alist
它应该调用它dict.iterkeys()
。
在 Python 2 中,.keys()
返回一个键列表,但在 Python 3 中,它返回一个非列表迭代器。由于 2to3 无法知道您是否真的需要将键作为列表,所以它必须谨慎行事并将调用包含在内,list
以便您真正得到一个列表。
在 Python2 中,keys
返回一个列表,而在 3 中,返回的keys
是一个dict_keys
对象。因此,如果您依赖于列表结果行为,则显式转换是必要的。