为什么在添加原始和删除原始字典时原始字典的副本会更改?

时间:2020-07-08 00:55:49

标签: python python-3.x dictionary copy

所以基本上我知道浅拷贝和深拷贝有所不同。 我想了解的是,当我直接复制时:

d1 = {"a": "1"}
d2 = {}
d2 = d1
d1["b"] = "2"
del d1

print(d2)

这将输出返回为

{"a": "1", "b": "2"}

我的问题是为什么会发生这种情况,我该怎么做才能不让这种情况发生?我不希望d2在复制后更改。有没有不用copy.deepcopy()的方法吗?

3 个答案:

答案 0 :(得分:1)

不,您不能复制这样的对象。当您说d2 = d1时,您没有在复制d1,这将导致d2只是d1的另一个名称。如果您不希望它更新“ b”:“ 2”,请使用dict(d1)

d1={"a":1}
d2=dict(d1)
d1["b"]="2"
del d1
print(d2)

答案 1 :(得分:0)

使用.copy()创建d1的(浅表副本),如下所示:

d1 = {"a": "1"}
d2 = d1.copy()
d1["a"] = "2"
print(d2)

输出:

{'a':'1'}

原始代码无法按预期工作的原因是d1和d2都指向同一对象。

答案 2 :(得分:0)

通过分配d2 = d1,它们都指向内存中的同一变量。您可以使用任何一个名称修改此值,因为它们都指向同一事物。

这不是副本,您只需将参考计数加1。通过使用del d1,您会将引用计数递减1,但是d2仍指向内存中的相同值。

要创建两个都是独立实体的副本,请使用d2 = d1.copy()