返回

浅拷贝与深拷贝的区别

前端

浅拷贝与深拷贝:深入理解对象克隆

浅尝辄止的浅拷贝

浅拷贝创建一个新的对象,并复制原始对象的属性值。然而,对于非基本类型属性(如引用类型),浅拷贝只会复制其内存地址,而不是创建一个新实例。这意味着对新对象的属性所做的任何修改都会反映在原始对象中,反之亦然。

示例:

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. 何时使用深拷贝?

当需要修改对象的属性而不会影响原始对象时,需要使用深拷贝。