2016-09-12 10 views
-1

私はこれをPythonで行うと、すべてのキーを一度に更新します。代わりに.getの私は[]演算子を使用している場合Python dict.fromkeysは同じid要素を返します

>>> base = {} 
>>> keys = ['a', 'b', 'c'] 
>>> base.update(dict.fromkeys(keys, {})) 
>>> base.get('a')['d'] = {} 
>>> base 
{'a': {'d': {}}, 'c': {'d': {}}, 'b': {'d': {}}} 
>>> map(id, base.values()) 
[140536040273352, 140536040273352, 140536040273352] 

これは起こりません:

>>> base['a']['d'] = {} 
>>> base 
{'a': {'d': {}}, 'c': {}, 'b': {}} 

なぜ?

+3

「dict.fromkeys」がどのように動作するのかは、それぞれを個別のオブジェクトにするために行うことができます。 – vaultah

+2

Pythonはあなたが 'dict.fromkeys()'に渡した辞書オブジェクトを自動的にクローンしません。 3つのキーはすべて同じdictを参照します。 – Blender

+0

問題は、関数やクラスがそのように振る舞うのではなく、それがうまくいくと思いますか?ワークフローに驚いたことはありますか?そうであれば、別のAPIを考えてメーリングリストに提案してください。 –

答えて

0

新しいキーの値を{}に初期化すると、新しい辞書が作成され、この辞書への参照が値になります。辞書が1つしかないので、1つの辞書を変更すると、「すべて」が変更されます。

0

Python 2.7.6と3.4.3の両方で試しました。 get('a')または['a']のいずれかが使用されている場合、私は同じ答えを得ます。あなたが最後にこれを確認できるかどうかお気付きください。 Pythonはオブジェクトの再利用を行います。したがって、dict.fromkeys()は、同じ空きを再利用します。dictは初期化されます。

関連する問題