浅拷贝与深拷贝的区别
2024-02-17 09:32:11
浅拷贝与深拷贝:深入理解对象克隆
浅尝辄止的浅拷贝
浅拷贝创建一个新的对象,并复制原始对象的属性值。然而,对于非基本类型属性(如引用类型),浅拷贝只会复制其内存地址,而不是创建一个新实例。这意味着对新对象的属性所做的任何修改都会反映在原始对象中,反之亦然。
示例:
class Person:
def __init__(self, name, address):
self.name = name
self.address = address
person1 = Person("John Doe", Address("123 Main Street", "Anytown", "CA", "12345"))
person2 = copy.copy(person1)
# 修改person2的name属性
person2.name = "Jane Doe"
# 打印person1和person2的name属性
print(person1.name) # 输出:"John Doe"
print(person2.name) # 输出:"Jane Doe"
# 修改person2的address属性
person2.address.street = "456 Elm Street"
# 打印person1和person2的address属性
print(person1.address.street) # 输出:"456 Elm Street"
print(person2.address.street) # 输出:"456 Elm Street"
在上面的示例中,person2是person1的浅拷贝。当person2的name属性被修改时,person1的name属性也随之改变。同样地,当person2的address属性的street字段被修改时,person1的address属性的street字段也随之改变。
深入挖掘的深拷贝
深拷贝创建一个新对象,并为所有非基本类型属性创建新的实例。与浅拷贝不同,深拷贝不会复制内存地址,而是创建独立于原始对象的副本。因此,对新对象的任何修改都不会影响原始对象。
要执行深拷贝,可以使用copy.deepcopy()函数。
示例:
# 创建一个person1的深拷贝
person2 = copy.deepcopy(person1)
# 修改person2的name属性
person2.name = "Jane Doe"
# 打印person1和person2的name属性
print(person1.name) # 输出:"John Doe"
print(person2.name) # 输出:"Jane Doe"
# 修改person2的address属性
person2.address.street = "456 Elm Street"
# 打印person1和person2的address属性
print(person1.address.street) # 输出:"123 Main Street"
print(person2.address.street) # 输出:"456 Elm Street"
在上面的示例中,person2是person1的深拷贝。当person2的name属性被修改时,person1的name属性保持不变。同样地,当person2的address属性的street字段被修改时,person1的address属性的street字段保持不变。
浅尝辄止与深入挖掘:何时选择?
浅拷贝和深拷贝是根据特定场景选择的两种关键技术。一般而言,当需要共享对象的属性时,使用浅拷贝就足够了。然而,当需要修改对象的属性而不会影响原始对象时,则需要使用深拷贝。
5 个常见问题解答
1. 浅拷贝和深拷贝之间的主要区别是什么?
浅拷贝只复制原始对象的属性值,而深拷贝创建非基本类型属性的新实例。
2. 如何执行浅拷贝?
可以使用copy.copy()函数执行浅拷贝。
3. 如何执行深拷贝?
可以使用copy.deepcopy()函数执行深拷贝。
4. 何时使用浅拷贝?
当需要共享对象的属性时,使用浅拷贝就足够了。
5. 何时使用深拷贝?
当需要修改对象的属性而不会影响原始对象时,需要使用深拷贝。