2017-12-21 8 views
1

Python2Pytnon32to3にマイグレーションしています。 (とPython3.5.2正確に)dict.keys()をPython3の反復のリスト(dict.keys())に変換する必要がありますか?2to3はそれを変換することを提案します

マイグレーション中に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_keyslistしかしdict_keysはまだ上記の単純なコードでは、型キャストせずにlistのようなloopで動作するようですされていない返されます。

私がタイプキャストなしで使用すると、いくつかの副作用があるのでしょうか。 何もない場合は、不要な操作に見えます。

なぜ2to3はそれを示唆していますか?

答えて

2

一般的にiteratingは重要ではありませんが、keys()はpy3のリストではないのでインデックスを取得しようとすると問題になります。インデックスを取ることはできません。一般的に安全な操作、リスト呼び出しのコストを知っている、一般的にpy2でokだったらpy3でokになります。グラディは、繰り返し、すべてがうまく機能するために、言ったとしてではなく、あなたがリストを受信するアプリケーションを設計している場合は、ここで

+2

'len'にも' list() 'が必要です。 – hansaplast

+0

良い呼び出し。私もそれにぶつかりました。 –

1

は2

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

Pythonで一方の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のキーをpython 3に移植し、それを関数に渡すと、間違いなくエラーが返されます。

関連する問題