Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在添加原始词典和删除原始词典时,原始词典的副本会发生变化?_Python_Python 3.x_Dictionary_Copy - Fatal编程技术网

Python 为什么在添加原始词典和删除原始词典时,原始词典的副本会发生变化?

Python 为什么在添加原始词典和删除原始词典时,原始词典的副本会发生变化?,python,python-3.x,dictionary,copy,Python,Python 3.x,Dictionary,Copy,所以基本上我知道浅拷贝和深拷贝是不同的。 我试图理解的是,当我直接复制时: d1 = {"a": "1"} d2 = {} d2 = d1 d1["b"] = "2" del d1 print(d2) 这会将输出返回为 {"a": "1", "b": "2"} 我的问题是为什么会发生这种情况,我该怎么做才能不让这种情况发生?我不想在

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

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

print(d2)
这会将输出返回为

{"a": "1", "b": "2"}
我的问题是为什么会发生这种情况,我该怎么做才能不让这种情况发生?我不想在复印完后就改变。有没有办法不使用
copy.deepcopy()

使用.copy()创建d1的(浅拷贝),如下所示:

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

{'a':'1'}


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

通过赋值
d2=d1
,它们都指向内存中的同一变量。您可以使用任意一个名称修改此值,因为它们都指向同一个对象

这不是一个副本,您只是将引用计数增加一。通过使用
del d1
可以将引用计数减少1,但
d2
仍指向内存中的相同值


若要在它们都是独立实体的情况下创建副本,请使用
d2=d1.copy()

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


你永远不会在上面代码的任何地方复制,无论是浅的还是深的。你真的应该阅读以下内容:链接副本是关于列表的,但同样的原则也适用<如果要复制对象,则code>dict对象具有
copy
方法,或者只需执行
d2=dict(d1)
。注意,在这之前,
d2={}
是完全没有意义的。因此,如果我同时删除引用d1和d2,内存位置会发生什么变化?它是否仍然存储同一个字典,但不引用任何其他对象?这就是我们通常所说的垃圾值吗?有一个垃圾收集器,它在后台运行,清除没有引用计数的对象。
d1={"a":1}
d2=dict(d1)
d1["b"]="2"
del d1
print(d2)