返回

浅拷贝、深拷贝与对象赋值的区别

前端

浅拷贝

浅拷贝是指将一个对象的所有属性值复制到另一个对象中,但不会复制该对象的子对象。这意味着如果子对象是一个引用类型变量,则浅拷贝只会复制该变量的内存地址,而不是复制子对象本身。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person1 = Person("John", 30)
person2 = person1  # 浅拷贝

person2.name = "Mary"

print(person1.name)  # 输出:"Mary"
print(person2.name)  # 输出:"Mary"

在这个示例中,person2 是 person1 的浅拷贝。当我们修改 person2.name 时,person1.name 也随之改变,因为它们指向同一个对象。

深拷贝

深拷贝是指将一个对象的所有属性值和子对象都复制到另一个对象中。这意味着如果子对象是一个引用类型变量,则深拷贝会递归地复制该子对象的所有属性值和子对象。

import copy

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person1 = Person("John", 30)
person2 = copy.deepcopy(person1)  # 深拷贝

person2.name = "Mary"

print(person1.name)  # 输出:"John"
print(person2.name)  # 输出:"Mary"

在这个示例中,person2 是 person1 的深拷贝。当我们修改 person2.name 时,person1.name 不受影响,因为它们指向不同的对象。

对象赋值

对象赋值是指将一个对象赋值给另一个变量。这与浅拷贝和深拷贝不同,它只是将对象的内存地址赋值给另一个变量,而不是复制对象本身。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person1 = Person("John", 30)
person2 = person1  # 对象赋值

person2.name = "Mary"

print(person1.name)  # 输出:"Mary"
print(person2.name)  # 输出:"Mary"

在这个示例中,person2 是 person1 的对象赋值。当我们修改 person2.name 时,person1.name 也随之改变,因为它们指向同一个对象。

区别

浅拷贝、深拷贝和对象赋值的区别在于如何处理引用类型变量。浅拷贝只复制引用类型变量的内存地址,而深拷贝会递归地复制引用类型变量的所有属性值和子对象。对象赋值只是将对象的内存地址赋值给另一个变量,而不是复制对象本身。

何时使用浅拷贝、深拷贝和对象赋值

浅拷贝通常用于复制简单的数据结构,例如字符串、数字和布尔值。深拷贝通常用于复制复杂的数据结构,例如列表、字典和对象。对象赋值通常用于将一个对象赋值给另一个变量,而不复制对象本身。

结论

浅拷贝、深拷贝和对象赋值是编程中常见的操作,它们之间的区别在于如何处理引用类型变量。在不同的情况下,我们应该选择合适的复制方法。