我正在进行迁移,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并应用于它的列表函数的应用程序,它肯定会抛出一个错误