我是否应该将 dict.keys() 转换为 list(dict.keys()) 以在 Python3 中进行迭代?2to3 建议将其转换

Should I convert dict.keys() into list(dict.keys()) for iteration in Python3?, 2to3 suggests converting that

我正在进行迁移,Python2Pytnon3 2to3。 (Python2.7.12Python3.5.2 正好)

在进行迁移时,2to3 建议我使用如下所示的类型转换。

a = {1: 1, 2: 2, 3: 3}

for i in a.keys():  ----> for i in list(a.keys()):
    print(i)

之后,我尝试检查脚本中有什么不同。

$ python3
>>> a = {1: 1, 2: 2, 3: 3}
>>> a.keys()
dict_keys([1, 2, 3])
>>> for i in a.keys(): print(i)
1
2
3

显然 returns 不同的类型 dict_keys 不是 listdict_keys 似乎仍然可以与 loop 一起工作,就像 list 没有类型- 在上面的简单代码中进行转换。

我想知道如果我不使用类型转换,会不会有一些副作用。 如果什么都没有,看起来是不必要的操作。

为什么 2to3 这么建议?

一般来说它对迭代没有影响,但是如果你尝试获取索引就很重要了,因为 keys() 不是 py3 中的列表,所以你不能获取它的索引,它通常是一个安全的操作,知道列表调用的成本,通常如果在 py2 中可以,那么在 py3 中也可以。

这里有一个具体的例子,在python3

a = {1: 1, 3: 2, 2: 3}
>>> a
{1: 1, 2: 3, 3: 2}
>>> a.keys()
dict_keys([1, 2, 3])
>>> type(a.keys())
<class 'dict_keys'>
>>> 

而在 python 2

 a={1: 1, 2: 3, 3: 2}
>>> type(a.keys())
<type 'list'>
>>> 

正如 Grady 所说,对于迭代,一切都运行良好,但是如果您正在设计一个应用程序,该应用程序接收 Python 2 中的键列表,并将其移植到 python 3 并应用于它列表函数,肯定会报错

我假设这只是最近才成为现实,但现在 keys() 是一个列表类型,所以我认为将其类型转换为列表没有任何作用,如果我错了请纠正我。

编辑: 没关系,显然我使用的程序是旧版本的 python。我尝试了 python 的更新版本,它 returns 键入 dict_keys。