2012-02-03 8 views
0

辞書の要素を最適化するモンテカルロコードを作成しようとしています。モンテカルロアルゴリズムでのPython辞書の更新

A = {} 
A[1] = ['a','b','c'] 
A[2] = ['d','e','f'] 

これは

>>> A 
{1: ['a', 'b', 'c'], 2: ['d', 'e', 'f']} 

、その結果として、例えば、私は今私のモンテカルロでのトライアル動きがランダムな要素を取ることであると言う私の元の辞書の定義「」Aから[1]それをA [2]に入れます。しかし、私は元の辞書を保持したい。だから私は、最初に新しい辞書を作成:

B = A 

をそしてBIに私が入手したかった修正辞書になり、必要な変更

B[1].remove('a') 
B[2].append('a') 

ますしかし

>>> B 
{1: ['b', 'c'], 2: ['d', 'e', 'f', 'a']} 

をこれは私の元の辞書Aも変えてしまいました。私はそれをバックアップしたかったのです。

>>> A 
{1: ['b', 'c'], 2: ['d', 'e', 'f', 'a']} 

これを行う方法はありますか。 ご協力いただきありがとうございます!

+0

なぜ 'B = A'が辞書のコピーを作ると思いますか? – kindall

+0

実際には、B = AはAのコピーを作成してBに割り当てますが、Aは辞書への参照です(その内容はリストへの参照で構成されています)。私は役に立つと思っています... – jimifiki

答えて

2

あなたは辞書の深いコピーを実行する必要があります。これを行わない場合

import copy 
B = copy.deepcopy(A) 

は、配列の参照は、辞書の間で共有されています。

+0

これは美しく働いた、ありがとう! – ricoamor

0

辞書の浅いコピーを行うための方法があります:

A = {} 
A[3] = 2 
C = A.copy() 
C[3] = 3 
print C[3],A[3] 

出力:3,2

あなたの鍵は、参照が実際にしているので、これは、あなたの特定のケースでは動作しませんあなたのケースでは、オブジェクトがどのように動作し、コピーを実装するかを知っているか、またはあなたのコピーを実装しているかのいずれかを知っているか、deepcopy()を作成しています。 ディープコピーが実際にどのように動作するかを制御することができないため、私は後者の解決策があまり好きではありません。 http://docs.python.org/library/copy.html

+0

dictへの参照のコピーと辞書のコピーの違いを確認するには、次のようにしてください。A = {0:3,1:4,2:3}; B = A; C = A.copy(); B [2] = 4;プリントA [2]、B [2]、C [2]。 – jimifiki