2017-12-21 2 views
1

zu konvertieren Ich mache eine Migration, Python2 zu Pytnon3 mit 2to3. (Python2.7.12 und Python3.5.2 genau)Sollte ich dict.keys() in list (dict.keys()) für die Iteration in Python3? Konvertieren, schlägt 2to3 vor, das

Während die Migration zu tun, 2to3 schlagen vor, mich wie die unter Typ-Druckguss verwendet werden.

a = {1: 1, 2: 2, 3: 3} 

for i in a.keys(): ----> for i in list(a.keys()): 
    print(i) 

Danach versuche ich, zu überprüfen, was für einen Unterschied es in einem Skript.

$ 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 

Es gibt offenbar verschiedene Arten dict_keys nicht sein list aber dict_keys noch mit loop wie list ohne Typ-Cast in dem obigen einfachen Code zu funktionieren scheinen.

Ich frage mich Wenn ich ohne Typ-Cast verwende, gäbe es einige Nebeneffekte oder nicht. Wenn es nichts gibt, sieht es unnötig Operation aus.

Warum schlägt 2to3 das vor?

Antwort

2

Im Allgemeinen ist es nicht wichtig für die Iteration, aber es ist wichtig, wenn Sie versuchen, einen Index zu nehmen, weil keys() keine Liste in Py3 ist, so dass Sie einen Index davon nicht nehmen können in der Regel eine sichere Operation, wissen die Kosten der Liste Anruf, in der Regel, wenn es in Py2 ok war, wird es in Py3 in Ordnung sein.

+2

auch für 'len' Sie brauchen 'list()' – hansaplast

+0

guten Ruf werfen. Ich bin auch darauf gestoßen. –

1

hier ist ein konkretes Beispiel, in 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'> 
>>> 

während in Python 2

a={1: 1, 2: 3, 3: 2} 
>>> type(a.keys()) 
<type 'list'> 
>>> 

als Grady sagte, für Iteration alles gut funktioniert, aber wenn Sie eine Anwendung entwerfen, die eine Liste erhält von Schlüsseln in Python 2 und Sie es auf Python 3 portieren und auf sie Listenfunktionen anwenden, wird es definitiv einen Fehler

Verwandte Themen