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 回答