类的浅拷贝和深拷贝的区别
在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++']
上述代码中,我们创建了一个包含name
、age
和skills
属性的类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
的值。
总结
综上所述,深拷贝将对象及其属性完全复制到新的对象中,即使原始对象发生了改变,深拷贝对象也不会受到影响。而浅拷贝只是复制对原始对象的引用,所以如果原始对象发生了改变,浅拷贝对象也会受到影响。