尝试复制一个字典,其值为集合,但不起作用。

46 浏览
0 Comments

尝试复制一个字典,其值为集合,但不起作用。

这个问题已有答案:

深拷贝Python字典

我试图复制一个字典,该字典的值是一个集合。

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中的值链接在一起。如何使它们拥有独立的值呢?

admin 更改状态以发布 2023年5月21日
0
0 Comments

你可以使用copy.deepcopy来完成,像这样:

import copy
dic1 = copy.deepcopy(dic)

通常情况下,当你复制一个字典对象时,对于每个键值对,都会创建一个新的键引用(字典无法允许不可变对象作为键),并且还会创建一个新的值对象引用。新的引用将引用同一个原始对象。更新一个集合实际上是对该对象进行改变。因此,新的引用和原始对象将反映这些变化。

进行深拷贝时,它实际上会创建值对象的新副本(不是新的引用),即使它是可变对象。这个操作是递归进行的。

0