返回
深拷贝与浅拷贝,你真的能说清楚吗?
前端
2023-11-12 15:40:42
深拷贝与浅拷贝
定义
- 深拷贝(Deep Copy): 深拷贝是指将一个对象的所有内容(包括对象引用的子对象)都复制一份,这样就创建了一个全新的对象,与原对象完全独立。
- 浅拷贝(Shallow Copy): 浅拷贝只复制一个对象及其直接属性的值,而不复制对象引用的子对象。这样就创建了一个新的对象,但该对象与原对象共享相同的子对象。
区别
深拷贝和浅拷贝的区别主要在于对对象引用的处理方式。深拷贝会将对象引用的子对象也复制一份,而浅拷贝只复制对象引用的地址。
举个例子,假设有一个包含两个属性的对象person
,分别是name
和address
。address
是一个对象,它包含两个属性:street
和city
。
class Person:
def __init__(self, name, address):
self.name = name
self.address = address
class Address:
def __init__(self, street, city):
self.street = street
self.city = city
# 创建一个 Person 对象
person = Person('John Doe', Address('Main Street', 'Anytown'))
# 使用深拷贝创建 person 的副本
person_copy = copy.deepcopy(person)
# 使用浅拷贝创建 person 的副本
person_copy_shallow = copy.copy(person)
如果我们使用深拷贝创建 person
的副本 person_copy
,那么 person_copy
将拥有自己的一套 address
属性,而 person_copy_shallow
则与 person
共享相同的 address
属性。
print(person.address is person_copy.address)
# False
print(person.address is person_copy_shallow.address)
# True
应用场景
深拷贝和浅拷贝在不同的场景下都有各自的应用。
- 深拷贝: 深拷贝通常用于复制复杂的对象,如包含许多子对象的对象。深拷贝可以确保复制后的对象与原对象完全独立,这样就可以对复制后的对象进行修改,而不会影响到原对象。
- 浅拷贝: 浅拷贝通常用于复制简单对象,如不包含子对象的对象。浅拷贝可以节省内存空间,因为它只复制对象及其直接属性的值,而不复制对象引用的子对象。
深拷贝与浅拷贝的实现
在 Python 中,可以使用 copy.deepcopy()
函数来进行深拷贝,可以使用 copy.copy()
函数来进行浅拷贝。
在 Java 中,可以使用 clone()
方法来进行深拷贝,可以使用 assign()
方法来进行浅拷贝。
在 C++ 中,可以使用 new
运算符来进行深拷贝,可以使用 =
运算符来进行浅拷贝。
总结
深拷贝和浅拷贝是两种不同的对象复制方式,它们的区别在于对对象引用的处理方式。深拷贝会将对象引用的子对象也复制一份,而浅拷贝只复制对象引用的地址。深拷贝和浅拷贝在不同的场景下都有各自的应用。