2017-04-05 9 views
0

こんにちは、誰もが説明できる:私は同じ第二のキーですべての値dict1の値を変更しようとするたびに最初のケースでそうPythonの辞書、我々は次の動作持っている理由missmatch

>>> k = [0.5, 1, 2] 
>>> m = [0.5, 1, 2] 
>>> dict1 = dict.fromkeys(k, dict.fromkeys(m, 0)) 
>>> dict1 
{0.5: {0.5: 0, 1: 0, 2: 0}, 1: {0.5: 0, 1: 0, 2: 0}, 2: {0.5: 0, 1: 0, 2: 0}} 
>>> dict1[0.5][0.5]= 4.5 
>>> dict1 
{0.5: {0.5: 4.5, 1: 0, 2: 0}, 1: {0.5: 4.5, 1: 0, 2: 0}, 2: {0.5: 4.5, 1: 0, 2: 0}} 


>>> dict2 = {0.5: {0.5: 0, 1: 0, 2: 0}, 1: {0.5: 0, 1: 0, 2: 0}, 2: {0.5: 0, 1: 0, 2: 0}} 
>>> dict2[0.5][0.5] = 4.5 
>>> dict2 
{0.5: {0.5: 4.5, 1: 0, 2: 0}, 1: {0.5: 0, 1: 0, 2: 0}, 2: {0.5: 0, 1: 0, 2: 0}} 

をdict1 [0.5] [0.5] = 4.5も何らかの理由でdict1 [1] [0.5]を変更します)。関数が呼び出され

dict.fromkeys(m, 0)ための実行一度とき、その後、dict.fromkeys(k, dict.fromkeys(m, 0))のためにすべての値に同じ辞書を置く:

+1

'dict.fromkeys(m、0)'は一度実行され、 'dict.fromkeys(k、dict.fromkeys(m、0))'のすべての値に同じ辞書を置くためです。これを確認するには 'for dct1 for dict:print id(dct)'を実行します。これらはすべて同じ 'id'になります。同じ「オブジェクト」 – TemporalWolf

+2

サブ辞書は1つしか作成されていません。今あなたが持っているのは、辞書そのものが複数の方法でアクセスできることです。 'dict [0.5]'と 'dict [1]'は同じ辞書を参照しています(コピーしません) – sgrg

答えて

0

サブ辞書は1つしか作成されていません。今あなたが持っているのは、辞書そのものが複数の方法でアクセスできることです。 dict[0.5]dict[1]は同じ辞書を指します(そのコピーではありません)。

dict1 = {k_outer: {k_inner:0 for k_inner in m} for k_outer in k} 

これは、それによって同じネストされた辞書にアクセスして、それらすべての問題を回避、各キーの新しいネストされた辞書を作成します:あなたが何をしたいかを達成する

一つの方法は、dictの理解を使用することです。

1

私はこの一般的な問題は共通ですが、良いデュープターゲットを発見していません。これを確認するにはfor dct in dict1: print id(dict1[dct])を実行してください。すべて同じidとなります。同じオブジェクト:

>>> for dct in dict1: print id(dict1[dct]) 
140401847695352 
140401847695352 
140401847695352 

パラメータはだけなのでdict.fromkeysは、すべてのキーに(つまりが何であれ)同じ値を入れます...機能が呼び出されたときに、一度だけ評価されているためです。それは同等です:

dict1 = {key: {ikey: 0 for ikey in m} for key in k} 

または、コピー経由:

異なる得どちらも
inner_dct = dict.fromkeys(m, 0) 
dict1 = {} 
for key in k: 
    dict1[key] = inner_dct.copy() 

default_dct = dict.fromkeys(m, 0) 
dict1 = dict.fromkeys(k, default_dct) 

代わり、あなたは辞書内包表記を使用することができます値:

>>>for dct in dict1: print id(dict1[dct]) 
140401847695352 
140401847646200 
140401847644240 
+0

これは、dict1の単一のキーを変更できないということですか?それは酷いことだ。 – alDiablo

+0

@alDiabloこれは、ネストされた辞書を異なる方法で作成する必要があることを意味します。 – TemporalWolf

+0

'dict.fromkeys'はクイックリード専用です。 – alDiablo

関連する問題