返回

浅拷贝与深拷贝,巧用妙法稳扎根基

前端

好的,让我来详细地介绍一下浅拷贝和深拷贝,以及它们的实现方法:

认识浅拷贝

浅拷贝,顾名思义,就是对对象进行一层浅层复制,即只复制对象本身的属性值,而不复制其子对象。当浅拷贝一个对象时,新创建的对象和原始对象拥有相同的属性值,但它们各自指向独立的内存地址。

揭开深拷贝的神秘面纱

与浅拷贝不同,深拷贝会对对象及其子对象进行递归复制。也就是说,不仅会复制对象本身的属性值,还会复制其子对象的属性值,如此往复,直到达到最底层的子对象。当深拷贝一个对象时,新创建的对象和原始对象完全独立,指向不同的内存地址。

Python中的浅拷贝与深拷贝

在Python中,浅拷贝可以通过copy.copy()函数实现,而深拷贝可以通过copy.deepcopy()函数实现。

import copy

# 对象 person 包含属性name和address
person = {"name": "John Doe", "address": {"street": "123 Main St", "city": "Anytown", "state": "CA"}}

# 浅拷贝 person 对象,创建对象 person_shallow
person_shallow = copy.copy(person)

# 深拷贝 person 对象,创建对象 person_deep
person_deep = copy.deepcopy(person)

# 修改 person_shallow 的 address 属性
person_shallow["address"]["street"] = "456 Elm St"

# 修改 person_deep 的 address 属性
person_deep["address"]["street"] = "789 Oak St"

# 打印 person、person_shallow 和 person_deep 的 address 属性
print(person["address"]["street"])  # 789 Oak St
print(person_shallow["address"]["street"])  # 456 Elm St
print(person_deep["address"]["street"])  # 789 Oak St

从输出中可以看出,修改person_shallowaddress属性不会影响personperson_deepaddress属性,而修改person_deepaddress属性不会影响personperson_shallowaddress属性。这说明person_shallowperson是浅拷贝,它们共享相同的address对象,而person_deep是深拷贝,它拥有一个独立的address对象。

总结

浅拷贝和深拷贝是程序设计中常见的两个概念,它们对对象及其子对象的复制方式不同。浅拷贝只复制对象本身的属性值,而深拷贝会对对象及其子对象进行递归复制。在Python中,可以通过copy.copy()函数和copy.deepcopy()函数实现浅拷贝和深拷贝。了解浅拷贝和深拷贝的原理和实现方法,有助于我们在编程中更好地处理对象复制的问题。