0

辞書の要素を最適化するモンテカルロコードを書き込もうとしています。たとえば、元の辞書を次のように定義します

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

これにより、

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

ここで、私のモンテカルロでの試行的な動きは、A[1]からランダムな要素'a'を取得し、それを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']}

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

4

2 に答える 2

2

ディクショナリのディープ コピーを実行する必要があります。

import copy
B = copy.deepcopy(A)

これを行わないと、配列参照が辞書間で共有されます。

于 2012-02-03T17:06:36.140 に答える
0

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

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

出力: 3,2

ただし、キーは実際に変更可能なオブジェクトへの参照であるため、これは特定のケースでは機能しません。あなたのケースでは、オブジェクトがどのように機能するかを知っていて、コピーを実装します。

B = {}
for i in A.keys():
    B[i] = []
    B[i].extend(A[i])
B[1].remove('a')
B[2].append('a')

または、deepcopy() を作成します。ディープコピーが実際にどのように機能するかを制御できないため、後者のソリューションはあまり好きではありません。http://docs.python.org/library/copy.html

于 2012-02-03T22:29:28.207 に答える