Python3 : 字典构造函数是否创建深拷贝?

Python3 : Do dict constructor create deep copies?

我正在尝试理解 Python3 中的浅拷贝与深拷贝概念。

从下面的代码中我发现在 dict2 中所做的更改没有在 dict1 中反映出来。

1>>> dict1 = {1:[1,2]}
2>>> dict2 = dict(dict1)
3>>> dict2[1]=[1,2,3]
4>>> dict1,dict2
({1: [1, 2]}, {1: [1, 2, 3]})

我对上述代码中第 2 行创建了深层副本的理解是否正确。

dict "constructor" 可以接受 "mapping object",在这种情况下,它会创建一个从映射对象的(键,值)对初始化的新字典。

这就是这里发生的情况,因为 dict1 是一个映射对象。

但这不是深拷贝,请看这个例子:

>>> dict1 = {1:[1,2]}
>>> dict2 = dict(dict1)
>>> dict1,dict2
({1: [1, 2]}, {1: [1, 2]})
>>> dict1[1].append(4)
>>> dict1,dict2
({1: [1, 2, 4]}, {1: [1, 2, 4]})
>>>

你看到 dict1dict2 是如何改变的,尽管我只改变了 dict1?那是因为它们都指向同一个列表。

在您的示例中,您用新列表替换了 dict2 的列表,这表明新字典确实是一个副本,而不仅仅是对原始字典的引用。

简单来说:字典本身是"copied",但里面的值不是。