2016-05-28 6 views
1

私の研究のどれも私を助けなかったので、誰かが私を助けてくれることを願っています。私は、簡単な辞書があります。私は、新しいキー値を割り当て、キー/値ペアのそれぞれを複製していPython - FORループでネストされた辞書に正しい値が書き込まれない

mydict = { 
    1: {1: 'Foo'}, 
    2: {1: 'Bar'} 
    } 

を:

私の mydict与える
nextKey = len(mydict) + 1 
for currKey in range(len(mydict)): 
    mydict[nextKey] = mydict[currKey + 1] 
    nextKey += 1 

{ 
    1: {1: 'Foo'}, 
    2: {1: 'Bar'}, 
    3: {1: 'Foo'}, 
    4: {1: 'Bar'}, 
    } 

これで、既存のネストされたすべての辞書に新しいキー値のペアを追加する必要があります。それぞれのキーは、する必要があります「2」と、それぞれの値は、ネストされた各辞書のために増やす必要があります。

newValue = 1 
for key in mydict: 
    mydict[key][2] = newValue 
    newValue += 1 

私は期待してい:

{ 
    1: {1: 'Foo', 2: 1}, 
    2: {1: 'Bar', 2: 2}, 
    3: {1: 'Foo', 2: 3}, 
    4: {1: 'Bar', 2: 4}, 
    } 

しかし、これは私のmydictを与えています。

{ 
    1: {1: 'Foo', 2: 3}, 
    2: {1: 'Bar', 2: 4}, 
    3: {1: 'Foo', 2: 3}, 
    4: {1: 'Bar', 2: 4}, 
    } 

私は私が使用しているIDEの可視化ツールを使用していると私は、キー/値のペアを複製するループを実行した後に、それは新しいキー柱を表示されます実際にそれを含むのではなく、複製された値を参照してください。これはおそらくこれと関係していますか?

IDE Visualisation

誰が助けてください/説明?

+0

"新しいキーは複製を参照するだけです実際にそれを含んでいるのではなく、価値を持っている」うん、それは答えです。\ – Jasper

答えて

0

これは、最初のループではネストされた辞書をコピーするのではなく、同じ辞書に新しい参照を追加するだけなので、これが起こります。

は多分明確な例を与えるために:あなたは(あなたの元のコードで)二つのループ後の第2のループから抜け出すとしたら、あなたの出力は次のようになります。

{1: {1: 'Foo', 2: 1}, 
2: {1: 'Bar', 2: 2}, 
3: {1: 'Foo', 2: 1}, 
4: {1: 'Bar', 2: 2}} 

だからあなたのようなあなたの最初のループを修正することができますこの:あなたは、あなたの第二のループでは、これら4つの異なる辞書をアクセスできるように

for currKey in range(len(mydict)): 
    mydict[nextKey] = mydict[currKey + 1].copy() 
    nextKey += 1 

copy()機能は、辞書の本当のコピーを作成します。

0

あなたの前提は正しいです。最小限の例:

>>> a = {1: {"a": "A"}, 2:{"b": "B"}} 
>>> a[3] = a[1] 
>>> a 
{1: {'a': 'A'}, 2: {'b': 'B'}, 3: {'a': 'A'}} 
>>> id(a[3])       # a[1] and a[3] are the same object 
140510365203264 
>>> id(a[1]) 
140510365203264 
>>> a[1]['a'] = "changed"    # so changing one affects the "oter one" 
>>> a 
{1: {'a': 'changed'}, 2: set(['B', 'b']), 3: {'a': 'changed'}} 

あなたがオブジェクトをコピーしたい場合は、これを行うには、いくつかの方法があります:リストの

  • は:new = old[:]、辞書用のスライス表記
  • を使用して:dict.copy()
  • copy module
関連する問題