2012-02-03 85 views
0

我想寫一個蒙特卡洛代碼,我在那裏優化字典中的元素。例如,我定義我原來的字典作爲蒙特卡羅算法python字典更新

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

這導致

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

現在說在我蒙特卡洛試驗此舉是爲了採取隨機元素a,從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 2012-02-03 18:16:28

+0

實際上,看到的方式是B = A製作A的副本並將其分配給B,但A是對字典的引用(並且其內容由對列表的引用組成)。我希望我已經有用... – jimifiki 2012-02-03 22:36:24

回答

2

你需要做詞典的深層副本:

import copy 
B = copy.deepcopy(A) 

如果你不這樣做,數組引用的字典之間共享。

+0

這工作很好,謝謝! – ricoamor 2012-02-06 12:04:39

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

+0

請嘗試以下操作以獲取將引用複製到字典並複製字典的區別:A = {0:3,1:4,2:3}; B = A; C = A.copy(); B [2] = 4;打印A [2],B [2],C [2]。 – jimifiki 2012-02-03 22:39:19