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]})
>>>
你看到 dict1
和 dict2
是如何改变的,尽管我只改变了 dict1
?那是因为它们都指向同一个列表。
在您的示例中,您用新列表替换了 dict2
的列表,这表明新字典确实是一个副本,而不仅仅是对原始字典的引用。
简单来说:字典本身是"copied",但里面的值不是。
我正在尝试理解 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]})
>>>
你看到 dict1
和 dict2
是如何改变的,尽管我只改变了 dict1
?那是因为它们都指向同一个列表。
在您的示例中,您用新列表替换了 dict2
的列表,这表明新字典确实是一个副本,而不仅仅是对原始字典的引用。
简单来说:字典本身是"copied",但里面的值不是。