Должен ли я преобразовать dict.keys() в список (dict.keys()) для итерации в Python3?, 2to3 предлагает преобразовать это
Я делаю миграцию, 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
предположить что?
3 ответа
Обычно это не имеет значения для итерации, но имеет значение, если вы пытаетесь взять индекс, потому что 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'>
>>>
тогда как в питоне 2
a={1: 1, 2: 3, 3: 2}
>>> type(a.keys())
<type 'list'>
>>>
как сказал Грэди, для итерации все работает хорошо, но если вы разрабатываете приложение, которое получает список ключей в Python 2, и вы переносите его на python 3 и применяете к нему функции списка, оно обязательно выдаст ошибку
Я предполагаю, что это стало правдой только недавно, но теперь keys() является типом списка, поэтому я думаю, что приведение типа к списку ничего не делает, поправьте меня, если я ошибаюсь.
Редактировать: Неважно, видимо, программа, которую я использовал, была на старой версии Python. Я попробовал обновленную версию Python, и она возвращает тип dict_keys.