我正在使用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
建议?
答案 0 :(得分:3)
一般情况下,迭代无关紧要,但是如果你尝试取一个索引就行了,因为keys()不是py3中的列表,所以你不能把它作为索引,一般来说一个安全的操作,知道列表调用的成本,通常如果它在py2中没问题,它将在py3中正常。
答案 1 :(得分:1)
这是一个具体的例子,在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并应用于它列表函数的应用程序,它肯定会抛出错误