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



我正在迁移,Python2Pytnon32to3。 (确切地说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

它显然返回不同的类型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 的更新版本,它返回类型 dict_keys。

最新更新