官方讲解链接:https://docs.python.org/zh-cn/3.12/library/copy.html,当你需要copy的变量的值中有可变对象时,又想要两个变量隔离,不因某个改变而篡改另一个变量的值时,就用深拷贝,否则就用浅拷贝,简单的变量直接赋值就行。
- 浅拷贝
import copy
a = [999, list(range(2))]
b = copy.copy(a)
# 这里输出的值是一样的
print(a) # _>: [999, [0, 1]]
print(b) # _>: [999, [0, 1]]
# 对 a 的 可变部分 更改
a[1].append(3)
print(a) # _>: [999, [0, 1, 3]]
print(b) # _>: [999, [0, 1, 3]]
# b 因为 a 的改变而改变
- 深拷贝
import copy
a = [999, list(range(2))]
b = copy.deepcopy(a)
# 这里输出的值是一样的
print(a) # _>: [999, [0, 1]]
print(b) # _>: [999, [0, 1]]
# 对 a 的可变 部分更改之后
a[1].append(3)
print(a) # _>: [999, [0, 1, 3]]
print(b) # _>: [999, [0, 1]]
# b 没有因为 a 的改变而改变
深浅拷贝的定义
深浅拷贝是关于对象拷贝的两种不同方式,主要区别在于它们处理对象内部包含的其他对象(如列表、字典等)的方式。
浅拷贝
浅拷贝创建一个新的对象,这个对象的内容是原对象中子对象的引用。因此,如果原对象中的子对象是可变的(如列表、字典),修改这些子对象会影响到拷贝后的对象。
深拷贝
深拷贝创建一个新的对象,并且递归地复制原对象中的所有子对象。因此,深拷贝后的对象与原对象完全独立,修改原对象中的子对象不会影响到拷贝后的对象。
本质区别 >> 深浅拷贝最本质的区别在于它们处理嵌套对象的方式:
- 浅拷贝:只复制最外层对象,内部嵌套对象只是引用复制,因此修改嵌套对象会影响到原对象和拷贝对象。
- 深拷贝:不仅复制最外层对象,还递归地复制所有嵌套对象,因此原对象和拷贝对象完全独立,互不影响。