返回
拷贝揭秘:浅复制与深复制
前端
2024-01-15 14:25:03
浅拷贝
浅拷贝是一种简单的复制方法,它仅复制对象本身的状态,而不会复制其子对象的状态。这可以通过使用内置函数copy()或通过直接复制对象来实现。
# 使用copy()函数进行浅拷贝
obj1 = {'name': 'John', 'age': 25}
obj2 = copy.copy(obj1)
# 直接复制对象进行浅拷贝
obj3 = obj1
# 修改obj2中的age属性
obj2['age'] = 30
# 打印obj1和obj3的age属性
print(obj1['age']) # 输出:25
print(obj3['age']) # 输出:30
# 修改obj1中的name属性
obj1['name'] = 'Mary'
# 打印obj2和obj3的name属性
print(obj2['name']) # 输出:John
print(obj3['name']) # 输出:Mary
从上面的示例中可以看出,浅拷贝只复制了对象本身的状态,而没有复制其子对象的状态。当我们修改obj2中的age属性时,obj1的age属性没有发生变化,因为它们指向同一个地址。同样地,当我们修改obj1中的name属性时,obj2的name属性也没有发生变化。
深拷贝
深拷贝是一种更彻底的复制方法,它不仅复制对象本身的状态,还会复制其所有子对象的状态。这可以通过使用内置函数copy.deepcopy()或通过递归遍历对象来实现。
# 使用copy.deepcopy()函数进行深拷贝
obj1 = {'name': 'John', 'age': 25}
obj2 = copy.deepcopy(obj1)
# 直接复制对象进行深拷贝
obj3 = obj1
# 修改obj2中的age属性
obj2['age'] = 30
# 打印obj1和obj3的age属性
print(obj1['age']) # 输出:25
print(obj3['age']) # 输出:25
# 修改obj1中的name属性
obj1['name'] = 'Mary'
# 打印obj2和obj3的name属性
print(obj2['name']) # 输出:John
print(obj3['name']) # 输出:Mary
从上面的示例中可以看出,深拷贝复制了对象本身的状态及其所有子对象的状态。当我们修改obj2中的age属性时,obj1的age属性没有发生变化,因为它们指向不同的地址。同样地,当我们修改obj1中的name属性时,obj2的name属性也没有发生变化。
浅拷贝与深拷贝的区别
浅拷贝和深拷贝的区别在于,浅拷贝仅复制对象本身的状态,而深拷贝复制对象本身的状态及其所有子对象的状态。这可以导致以下不同行为:
- 修改一个对象的属性不会影响另一个对象的属性。 这是因为浅拷贝只复制了对象本身的状态,而没有复制其子对象的状态。
- 两个对象可以指向同一个地址。 这是因为浅拷贝只复制了对象本身的地址,而没有复制其子对象的状态。
- 深拷贝比浅拷贝更耗时。 这是因为深拷贝需要遍历整个对象及其所有子对象,而浅拷贝只需要遍历对象本身。
何时使用浅拷贝和深拷贝
浅拷贝和深拷贝都有各自的适用场景。浅拷贝通常用于以下情况:
- 当您需要复制一个对象及其子对象的状态时,但您不希望修改子对象的状态。
- 当您需要复制一个对象,但您不关心其子对象的状态时。
深拷贝通常用于以下情况:
- 当您需要复制一个对象及其所有子对象的状态,并且您希望确保修改一个对象的属性不会影响另一个对象的属性。
- 当您需要复制一个对象,但您不确定其子对象的状态时。
结论
浅拷贝和深拷贝都是非常有用的工具,它们可以帮助您在不同的场景中复制对象。浅拷贝速度快,占用内存少,而深拷贝速度慢,占用内存多。在选择使用浅拷贝还是深拷贝时,您需要根据实际情况来权衡利弊。