2017-07-27 7 views
1

リストの中に多くの辞書があるリストはたくさんあります。私は単に、外側のリストのリストの1つに1つの辞書を割り当てます。しかし、外側のリストのすべてのリストのすべての辞書に割り当てられます。リスト内での辞書の割り当てが奇妙な結果になる

コード:出力

CL=3*[0] 
DL=4*[0] 
di= { 
    'A':[], 
    'B':[], 
    'C':CL, 
    'D':DL 
    } 
R=[[],[]] 
R[0].append(di) 
R[1].append(di) 

def func(dd): 
    dd[0][0]['A'].append("BANANA") 
    dd[0][0]['B'].append("ELEPHANT") 
    dd[0][0]['C'][0]='BLUE' 
    dd[0][0]['D'][3]='ROCK' 
    dd[0][0]['D'][2]=1111 

print(R[0]) 
print(R[1]) 

print("\n") 

func(R) 

print(R[0]) 
print(R[1]) 

:私は外側のリストの最初のリストの中の辞書に値を割り当てられていても

[{'A': [], 'C': [0, 0, 0], 'B': [], 'D': [0, 0, 0, 0]}]                          
[{'A': [], 'C': [0, 0, 0], 'B': [], 'D': [0, 0, 0, 0]}]                          


[{'A': ['BANANA'], 'C': ['BLUE', 0, 0], 'B': ['ELEPHANT'], 'D': [0, 0, 1111, 'ROCK']}]                  
[{'A': ['BANANA'], 'C': ['BLUE', 0, 0], 'B': ['ELEPHANT'], 'D': [0, 0, 1111, 'ROCK']}] 

あなたが見ることができるように、(funcが()に動作しますdd [0] ..のみ)、両方のリストが割り当てられました。

私のインデックスに間違いがありますか?なぜこれが起こるのですか?

+1

R [0]、R:あなたのコードを修正する

。 http://lucumr.pocoo.org/2011/7/9/python-and-pola/#pass-by-what-exactly – TheoretiCAL

+0

この記事は参考になりました:[Pythonの名前と値についての事実と神話]( http://nedbatchelder.com/text/names.html)、これはSOベテランのNed Batchelderによって書かれました。 –

答えて

2

コード

R[0].append(di) 
R[1].append(di) 

di参照によってRに追加します。これは、R[0]R[1]の両方が同じ基本オブジェクトを参照していることを意味します。したがって、1つを変更すると、元のオブジェクトが変更され、したがって両方が変更されます。

+0

こんにちは..お返事ありがとうございます....しかし、どうすればこの問題を回避することができますか? – nPab

+0

@nPab​​、Alex Hallさんは、自分の答えにあなたのコードを修正する方法を持っています。私はそのアプローチをお勧めします。 –

3
di= { 
    'A':[], 
    'B':[], 
    'C':CL, 
    'D':DL 
    } 
R=[[],[]] 
R[0].append(di) 
R[1].append(di) 

dididiです。それぞれdiを使用しても、別々のコピーは作成されません。 diが1つしかないため、R[0][0]R[1][[0]であり、すべての変更が同じdictに表示されます。 [1]初期辞書の二つの別々のコピーを、同じ辞書を保持しない

from copy import deepcopy 
R[0].append(deepcopy(di)) 
R[1].append(deepcopy(di))