图解Python中浅拷贝copy()和深拷贝deepcopy()的区别

1. 深拷贝和浅拷贝的概念

在Python中,对象是指存储在内存中的数据结构,这些对象可能是Python内置对象(如列表、元组、字典等)或自定义对象。在Python中,变量是指对对象的引用,变量名可以指向不同类型的对象。深拷贝和浅拷贝是对Python中对象的复制方式的分类,定义如下:

浅拷贝:复制对象,创建一个新的对象,但对象中的元素仍然是原对象中的元素的引用。

深拷贝:复制对象及其所有元素,创建一个新的对象,并递归地复制其所有元素。

2. 浅拷贝的示例

下面的代码用例演示浅拷贝的效果(注意代码中的注释):

import copy

a = [1, 2, 3]

b = [4, 5, 6]

c = [a, b] # c包含列表a和b

d = copy.copy(c) # 复制列表c,创建一个新的列表d

print(c) # [[1, 2, 3], [4, 5, 6]]

print(d) # [[1, 2, 3], [4, 5, 6]]

print(c is d) # False

print(c[0] is d[0]) # True,d[0]是a的引用,和c[0]引用同一个对象

可以看到,使用copy()函数进行浅拷贝后,创建了一个新的列表d,但其中元素仍然是a和b的引用。这点可以从c和d中包含的相同的子列表来看出。

3. 深拷贝的示例

下面的代码用例演示深拷贝的效果(注意代码中的注释):

import copy

a = [1, 2, 3]

b = [4, 5, 6]

c = [a, b] # c包含列表a和b

d = copy.deepcopy(c) # 复制列表c,创建一个新的列表d,并递归地复制子列表a和b

print(c) # [[1, 2, 3], [4, 5, 6]]

print(d) # [[1, 2, 3], [4, 5, 6]]

print(c is d) # False

print(c[0] is d[0]) # False,d[0]是a的副本,不是引用

可以看到,使用深拷贝后,创建了一个新的列表d,并且其中的元素不再是a、b的引用,而是它们的副本。这点可以从c和d中包含的不同的子列表来看出。

4. 总结

浅拷贝和深拷贝都是Python中常用的复制方式,区别在于复制元素的深度。如果对象包含子对象(如列表中包含列表),使用深拷贝可以实现递归复制所有子对象,而浅拷贝仅复制一层对象。

应用时,需要根据具体情况确定是使用浅拷贝还是深拷贝,以免出现意外的结果。同时,需要注意的是,对于可能出现循环引用的复杂对象,深拷贝可能会导致无法预料的情况。

后端开发标签