返回

浅拷贝和深拷贝的那些事,你真的弄懂了吗?

前端

在日常开发或面试中,浅拷贝和深拷贝都是很常见的知识点,但真正能理解它们的人却不多。甚至我们经常看到的帖子中也有很多错误。

什么是浅拷贝和深拷贝?

浅拷贝和深拷贝都是复制一个对象的操作。

浅拷贝只复制对象的引用,也就是说,它只复制对象在内存中的地址。如果两个对象使用同一个引用,那么它们就是浅拷贝。

深拷贝则复制对象的整个值,也就是说,它会复制对象的所有属性和方法。如果两个对象具有不同的引用,那么它们就是深拷贝。

浅拷贝和深拷贝的区别

浅拷贝和深拷贝的区别主要体现在以下几个方面:

  1. 复制对象的方式不同

浅拷贝只复制对象的引用,而深拷贝则复制对象的整个值。

  1. 内存占用不同

浅拷贝只占用较少的内存空间,因为只复制了对象的引用,而深拷贝则占用较多的内存空间,因为需要复制对象的所有属性和方法。

  1. 对象修改的影响不同

如果对浅拷贝的对象进行修改,那么对原始对象也会产生影响,因为它们使用的是同一个引用。如果对深拷贝的对象进行修改,那么对原始对象不会产生影响,因为它们具有不同的引用。

浅拷贝和深拷贝的用法

浅拷贝和深拷贝在不同的情况下都有各自的优势。

浅拷贝适合于以下场景:

  • 需要复制大量对象,并且对内存开销不敏感
  • 需要复制对象,并且不希望修改原始对象

深拷贝适合于以下场景:

  • 需要复制复杂对象,并且需要对复制的对象进行修改
  • 需要复制对象,并且需要保证原始对象不受修改

浅拷贝和深拷贝的示例代码

以下代码演示了浅拷贝和深拷贝的用法:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person1 = Person("张三", 20)
person2 = copy.copy(person1)  # 浅拷贝
person3 = copy.deepcopy(person1)  # 深拷贝

person2.name = "李四"
person3.age = 30

print(person1.name, person1.age)  # 张三 20
print(person2.name, person2.age)  # 李四 20
print(person3.name, person3.age)  # 张三 30

从上面的代码中可以看出,浅拷贝只复制了对象的引用,而深拷贝则复制了对象的整个值。

总结

浅拷贝和深拷贝都是复制一个对象的操作,但它们的区别在于,浅拷贝只复制对象的引用,而深拷贝则复制对象的整个值。浅拷贝和深拷贝在不同的情况下都有各自的优势,需要根据实际情况选择合适的复制方式。