详解类的浅拷贝和深拷贝的区别

  • Post category:Python

类的浅拷贝和深拷贝的区别

在Python中,使用拷贝的方式将一个对象复制到另一个变量中,涉及到两种拷贝方式:浅拷贝和深拷贝。对于自定义的类而言,也需要了解这两种拷贝方式的区别。

浅拷贝

浅拷贝即复制一个对象的引用,而不是完全复制对象本身。也就是说,如果原始对象发生了改变,浅拷贝对象也会受到这种变化的影响。

示例:

class Person:
    def __init__(self, name:str, age:int, skills:list):
        self.name = name
        self.age = age
        # 假设skills是一个列表
        self.skills = skills

person1 = Person("Tom", 18, ["Python", "Java"])
person2 = person1  # 浅拷贝

person1.skills.append("C++")

print(person1.skills)  # ['Python', 'Java', 'C++']
print(person2.skills)  # ['Python', 'Java', 'C++']

上述代码中,我们创建了一个包含nameageskills属性的类Person,并在skills属性中存储技能的列表。当我们将person1赋值给person2时,实际上是将person2指向person1所指向的内存地址,即对person1的浅拷贝。当我们向person1.skills中添加新的技能时,由于浅拷贝,person2.skills也会受到影响,这导致他们具有相同的技能。

深拷贝

与浅拷贝相反,深拷贝是将一个对象完全复制到另一个变量中,包括所有嵌套的引用对象。如果原始对象发生了改变,深拷贝对象不受影响。

示例:

import copy

class Person:
    def __init__(self, name:str, age:int, skills:list):
        self.name = name
        self.age = age
        # 假设skills是一个列表
        self.skills = skills

person1 = Person("Tom", 18, ["Python", "Java"])
person2 = copy.deepcopy(person1)  # 深拷贝

person1.skills.append("C++")

print(person1.skills)  # ['Python', 'Java', 'C++']
print(person2.skills)  # ['Python', 'Java']

上述代码中,我们使用copy.deepcopy()方法将person1进行深度拷贝保存到person2中。深拷贝会将对象及其属性完全复制到新的对象中,所以即使我们在person1.skills中添加了一个新的技能,也不会影响person2.skills的值。

总结

综上所述,深拷贝将对象及其属性完全复制到新的对象中,即使原始对象发生了改变,深拷贝对象也不会受到影响。而浅拷贝只是复制对原始对象的引用,所以如果原始对象发生了改变,浅拷贝对象也会受到影响。