我正在迁移,Python2
Pytnon3
2to3
。 (确切地说Python2.7.12
和Python3.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
没有list
但dict_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。