返回
浅拷贝与深拷贝:把握微妙差别,巧用编程技巧
前端
2023-10-04 14:37:11
概述:浅拷贝与深拷贝
在编程中,拷贝是指将一个对象的值复制到另一个对象的过程。根据复制方式的不同,拷贝可以分为浅拷贝和深拷贝。
- 浅拷贝 :浅拷贝只复制对象本身的数据,而不复制对象引用的其他对象。这意味着如果对象属性是基本的数据类型,复制的就是基本类型的值给新对象;但如果属性是引用数据类型,复制的就是内存中的地址。
- 深拷贝 :深拷贝复制对象本身的数据及其引用的所有对象。也就是说,它会递归地复制对象及其所有属性,直到所有属性都是基本数据类型。
何时使用浅拷贝和深拷贝
浅拷贝和深拷贝的使用场景不同,了解它们各自的优缺点可以帮助您做出正确的选择。
- 浅拷贝 :
- 优点:速度快,内存占用少。
- 缺点:如果对象属性是引用数据类型,可能会导致意外的修改。
- 深拷贝 :
- 优点:可以确保对象及其所有属性都被复制,避免意外的修改。
- 缺点:速度慢,内存占用多。
代码示例
为了更好地理解浅拷贝和深拷贝的区别,我们来看一个代码示例。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person1 = Person("John", 30)
person2 = person1 # 浅拷贝
person2.name = "Mary"
print(person1.name) # 输出:"Mary"
print(person2.name) # 输出:"Mary"
person3 = copy.deepcopy(person1) # 深拷贝
person3.name = "Bob"
print(person1.name) # 输出:"Mary"
print(person3.name) # 输出:"Bob"
在这个示例中,我们定义了一个 Person 类,它有两个属性:name 和 age。我们创建了两个 Person 对象:person1 和 person2。然后,我们将 person2 赋值为 person1,这相当于对 person1 进行了浅拷贝。这意味着 person2 和 person1 指向同一个对象。接下来,我们修改了 person2 的 name 属性,结果 person1 的 name 属性也随之改变,因为它们指向同一个对象。
然后,我们创建了另一个 Person 对象 person3,并将 person1 赋值给 person3,但这次我们使用了 copy.deepcopy() 函数。这相当于对 person1 进行了深拷贝,这意味着 person3 和 person1 是两个独立的对象。接下来,我们修改了 person3 的 name 属性,结果 person1 的 name 属性没有改变,因为它们是两个不同的对象。
总结
浅拷贝和深拷贝是编程中常用的两种拷贝方式,它们各有其优缺点。在使用时,需要根据具体情况选择合适的拷贝方式。如果您需要复制的对象属性是基本的数据类型,则浅拷贝是一个不错的选择;如果您需要复制的对象属性是引用数据类型,则深拷贝是一个更好的选择。