2014-12-15 8 views
6

Sto guardando un'uscita dal 2to3 che include questo cambiamento:Perché 2to3 cambia mydict.keys() in lista (mydict.keys())?

-   for file_prefix in output.keys(): 
+   for file_prefix in list(output.keys()): 

dove output è un dizionario.

Qual è il significato di questo cambiamento? Perché 2to3 fa questo?

In che modo questa modifica rende il codice Python 3 compatibile?

+1

try 'd.keys() [0]' su python 2 e poi su python 3 –

+0

Controlla questo http://stackoverflow.com/questions/16819222/how-to-return-dictionary-keys-as-a -list-in-python-3-3 – Joel

+0

https://www.python.org/dev/peps/pep-3106/ –

risposta

8

In Python 3, il metodo .keys() restituisce un oggetto di visualizzazione anziché un elenco, per motivi di efficienza.

Nel caso di iterazione, questo non importa, ma dove sarebbe importante se si stesse facendo qualcosa come foo.keys()[0] - non è possibile indicizzare una vista. Pertanto, 2to3 aggiunge sempre una conversione elenco esplicita per assicurarsi che qualsiasi indicizzazione potenziale non si interrompa.

È possibile rimuovere manualmente la chiamata list() ovunque che una vista funzioni correttamente; 2to3 non è abbastanza intelligente per capire quale caso è quale.

(Si noti che la versione 2.x potrebbe chiamare iterkeys() invece, dato che non è l'indicizzazione.)

0

In Python 2, .keys() restituisce una lista delle chiavi, ma in Python 3 restituisce un non-list iteratore . Dal momento che 2to3 non può sapere se hai davvero bisogno che le chiavi siano una lista, deve errare sul lato della cautela e avvolgere la chiamata in list in modo da ottenere davvero una lista.

0

In Python2, keys ha restituito un elenco mentre in 3 il ritorno di keys è un oggetto dict_keys. Quindi, se tu dipendessi dal comportamento del list-result, è necessaria la conversione esplicita.

3

In Python 2.x, dict.keys() restituisce un list.

In Python 3.x, dict.keys() restituisce una vista e deve essere passata a list() in modo da renderlo un list.

Poiché il codice Python 2.x non ha bisogno di un list, è necessario chiamare il numero dict.iterkeys().

Problemi correlati