尝试复制一个值为集合的字典失败

0 投票
1 回答
510 浏览
提问于 2025-05-01 17:32

我正在尝试复制一个字典,这个字典的值是集合。

dic = {0: set([1]), 1: set([0, 2]), 2: set([1, 3]), 3: set([2, 4]), 4: set([3])}
dic1 = dic.copy()
dic1[0].update(dic[1])
print dic
print dic1

但是我得到的结果是

{0: set([0, 1, 2]), 1: set([0, 2]), 2: set([1, 3]), 3: set([2, 4]), 4: set([3])}
{0: set([0, 1, 2]), 1: set([0, 2]), 2: set([1, 3]), 3: set([2, 4]), 4: set([3])}

所以现在它们基本上是一样的。我试过用字典推导式和 .copy() 方法,但都没有成功!我该怎么做才能让原来的字典保持不变呢?

我去看了 Python Tutor,发现字典的键在 dic1 中,但值却和 dic 里的值是关联的。我该怎么做才能让它们的值独立开来呢?

暂无标签

1 个回答

1

你可以使用 copy.deepcopy,像这样

import copy
dic1 = copy.deepcopy(dic)

通常,当你复制一个字典时,对于每一个键值对,都会创建一个新的键的引用(字典不允许不可变对象作为键),同时也会创建一个新的值的引用。这个新的引用实际上还是指向原来的对象。更新一个集合实际上是在改变这个对象。所以,新的引用和原来的对象都会反映出这些变化。

而当你使用深拷贝(deepcopy)时,它会真正创建一个值对象的新副本(而不是新的引用),即使这个对象是可变的。这个复制过程是递归进行的。

撰写回答