发现深拷贝和浅拷贝效果一致:请问一下有什么区别呢?

发现深拷贝和浅拷贝效果一致:

list1 = [{'a': 1}, {'b': 2}, {'c': 3}]


list2 = copy.copy(list1)  # 浅拷贝
list2 = copy.deepcopy(list1)  # 深拷贝

list1.remove({'b': 2})

print(list1, list2)  # [{'a': 1}, {'c': 3}] [{'a': 1}, {'b': 2}, {'c': 3}]

请问一下有什么区别呢?

阅读 893
4 个回答

你仔细看看你的结果,二者是不一样的。给你提供一个非常好用的代码执行visualize网站,帮助你理解代码执行过程: pythontutor,以下是两张截图:

shallow copy

copy.gif

deep copy

deepcopy.gif

下面还是照旧说一下深浅拷贝的原理
  • 深拷贝:创建一个全新的对象,并递归地复制原始对象中的所有元素,修改拷贝不影响原始对象。
  • 浅拷贝:只复制对象的顶层结构,保留对嵌套对象的引用,修改拷贝会影响原始对象。
两种拷贝方式的语法和示例。
  • 深拷贝

    • 创建新对象,递归复制所有元素,修改拷贝不影响原始对象。
    • 语法:copy.deepcopy()
    • 解释:copy.deepcopy() 方法创建原始对象的完全独立的副本,包括所有嵌套元素。对 deep_copied 所做的更改不会影响原始列表 a。 原始列表 a 的嵌套元素会递归地复制,以确保即使在复制列表中,深层嵌套的对象也是完全独立的。
    • 示例:使用 deepcopy 拷贝嵌套列表,修改拷贝中的元素不会影响原始列表。
import copy

a = [[1, 2, 3], [4, 5, 6]]

# Creating a deep copy of the nested list 'a'
b = copy.deepcopy(a)

# Modifying an element in the deep-copied list
b[0][0] = 99 
print(b)    # [[99, 2, 3], [4, 5, 6]]
print(a)    # [[1, 2, 3], [4, 5, 6]]

image.png

  • 浅拷贝

    • 只复制顶层结构,保留对嵌套对象的引用,修改拷贝会影响原始对象。
    • 语法:copy.copy()
    • 解释:浅拷贝仅复制外部结构,保留对嵌套对象的引用。在这种情况下,原始对象和浅拷贝对象之间的内部列表是共享的。 因此,对浅拷贝对象中嵌套元素(例如,修改 shallow_copied)的更改也会反映在原始对象中。
    • 示例:使用 copy 拷贝嵌套列表,修改拷贝中的元素会影响原始列表。
import copy  

a = [[1, 2, 3], [4, 5, 6]]

# Creating a shallow copy of the nested list 'original'
b = copy.copy(a)

# Modifying an element in the shallow-copied list
b[0][0] = 99

# Printing the original and shallow-copied lists  
print(b)    # [[99, 2, 3], [4, 5, 6]]
print(a)    # [[99, 2, 3], [4, 5, 6]]

image.png

如果还是不理解,b站或者youtube上面有动图解释,更方便你理解。

他们都是拷贝,得到的对象都不是原来的对象。所以只有修改足够“深”的时候,才能看到区别,比如你把 list1.remove({'b':2}) 换成 list1[1]['b'] = 5

浅拷贝只是列表是新的列表,它的元素还是原来的元素。但是深拷贝,元素也不是原来元素了。