2

我正在迁移,Python2与. (确切地说)Pytnon32to3Python2.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_keyslistdict_keys似乎仍然可以在loop没有类型转换的情况下使用。list

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

为什么会这样2to3建议?

4

3 回答 3

3

一般来说迭代没关系,但是如果你尝试取一个索引就很重要,因为keys()在py3中不是一个列表,所以你不能取它的索引,它通常是一个安全的操作,知道 list 调用的成本,一般如果在 py2 中没问题,在 py3 中也没问题。

于 2017-12-21T05:13:50.430 回答
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 并应用于它的列表函数,它肯定会抛出错误

于 2017-12-21T05:24:57.420 回答
0

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

编辑:没关系,显然我使用的程序是在旧版本的 python 上。我尝试了更新版本的 python,它返回类型 dict_keys。

于 2021-12-08T15:55:31.333 回答