返回

深拷贝与浅拷贝,你真的能说清楚吗?

前端

深拷贝与浅拷贝

定义

  • 深拷贝(Deep Copy): 深拷贝是指将一个对象的所有内容(包括对象引用的子对象)都复制一份,这样就创建了一个全新的对象,与原对象完全独立。
  • 浅拷贝(Shallow Copy): 浅拷贝只复制一个对象及其直接属性的值,而不复制对象引用的子对象。这样就创建了一个新的对象,但该对象与原对象共享相同的子对象。

区别

深拷贝和浅拷贝的区别主要在于对对象引用的处理方式。深拷贝会将对象引用的子对象也复制一份,而浅拷贝只复制对象引用的地址。

举个例子,假设有一个包含两个属性的对象person,分别是nameaddressaddress是一个对象,它包含两个属性:streetcity

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 运算符来进行深拷贝,可以使用 = 运算符来进行浅拷贝。

总结

深拷贝和浅拷贝是两种不同的对象复制方式,它们的区别在于对对象引用的处理方式。深拷贝会将对象引用的子对象也复制一份,而浅拷贝只复制对象引用的地址。深拷贝和浅拷贝在不同的场景下都有各自的应用。