2016-03-23 5 views
2

forのループが辞書のどのように鍵にアクセスしているのでしょうか? dict.keys()を呼び出し、そのリストを反復処理しますか?辞書の `for`ループはどのようにして具体的に動作しますか

私が求めている理由は、私は辞書のキー、任意のキーを照会することで、呼び出しの間(脇ビジュアルと読みやすさから)の性能に差がある場合、私は思っていた:

for key in dict: 
    my_func(dict[key]) 
    break 
上記の質問に私をもたらした

my_func(dict.keys()[0]) 

は - Pythonはボンネットの下に、具体的には、dictの上forループ中に何をするのでしょうか?

+0

'dictの[キー]' 'dict.keys(と同じ)[0] '? 'dict.keys()[0]'がキーを返すはずです – Hacketo

+1

[PEP 234]のイテレータプロトコルをチェックしてください(https://www.python .org/dev/peps/pep-0234 /) – miradulo

+0

あなたは聞いていますか? 'dicts'は順序付けされていないので、事故や運などによって全く同じではないでしょう。 – nlsdfnbch

答えて

2

dictを反復してもdict.key()は呼び出されません。辞書自体は反復をサポートしています。

>>> iter({'name': 'value'}) 
<dict_keyiterator object at 0x7f127da89688> 

BTW、dict.keysは、インデックス作成をサポートしていないディクショナリキービューを返します。

>>> {'name': 'value'}.keys() 
dict_keys(['name']) 
>>> {'name': 'value'}.keys()[0] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'dict_keys' object does not support indexing 

あなたが任意のキーを取得したい場合は、あなたがnextiterを使用することができます。

>>> next(iter({'name': 'value', 'name2': 'another value'})) 
'name' 

>>> next(iter({})) # <-- To handle empty case, pass default value 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
>>> next(iter({}), 'default value') 
'default value' 
+0

ああ、元気です。私のコンソール出力は、私がそこで混乱していた。 – nlsdfnbch

関連する問題