返回
浅拷贝和深拷贝的那些事,你真的弄懂了吗?
前端
2023-10-09 09:03:57
在日常开发或面试中,浅拷贝和深拷贝都是很常见的知识点,但真正能理解它们的人却不多。甚至我们经常看到的帖子中也有很多错误。
什么是浅拷贝和深拷贝?
浅拷贝和深拷贝都是复制一个对象的操作。
浅拷贝只复制对象的引用,也就是说,它只复制对象在内存中的地址。如果两个对象使用同一个引用,那么它们就是浅拷贝。
深拷贝则复制对象的整个值,也就是说,它会复制对象的所有属性和方法。如果两个对象具有不同的引用,那么它们就是深拷贝。
浅拷贝和深拷贝的区别
浅拷贝和深拷贝的区别主要体现在以下几个方面:
- 复制对象的方式不同
浅拷贝只复制对象的引用,而深拷贝则复制对象的整个值。
- 内存占用不同
浅拷贝只占用较少的内存空间,因为只复制了对象的引用,而深拷贝则占用较多的内存空间,因为需要复制对象的所有属性和方法。
- 对象修改的影响不同
如果对浅拷贝的对象进行修改,那么对原始对象也会产生影响,因为它们使用的是同一个引用。如果对深拷贝的对象进行修改,那么对原始对象不会产生影响,因为它们具有不同的引用。
浅拷贝和深拷贝的用法
浅拷贝和深拷贝在不同的情况下都有各自的优势。
浅拷贝适合于以下场景:
- 需要复制大量对象,并且对内存开销不敏感
- 需要复制对象,并且不希望修改原始对象
深拷贝适合于以下场景:
- 需要复制复杂对象,并且需要对复制的对象进行修改
- 需要复制对象,并且需要保证原始对象不受修改
浅拷贝和深拷贝的示例代码
以下代码演示了浅拷贝和深拷贝的用法:
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
从上面的代码中可以看出,浅拷贝只复制了对象的引用,而深拷贝则复制了对象的整个值。
总结
浅拷贝和深拷贝都是复制一个对象的操作,但它们的区别在于,浅拷贝只复制对象的引用,而深拷贝则复制对象的整个值。浅拷贝和深拷贝在不同的情况下都有各自的优势,需要根据实际情况选择合适的复制方式。