Должен ли я преобразовать 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.

Другие вопросы по тегам