详解类的浅拷贝和深拷贝的区别

  • Post category:Python

下面我将详细讲解类的浅拷贝和深拷贝的区别。

什么是浅拷贝和深拷贝?

  • 浅拷贝:浅拷贝会创建一个新的对象,新的对象具有原始对象的一部分或全部属性值,但共享相同的内存地址。在浅拷贝中,新对象只是原始对象的一个副本,对于属性是浅拷贝的对象,任何一方对其进行修改都会对其他所有人产生影响。
  • 深拷贝:深拷贝将创建一个新的对象,新对象具有原始对象的所有属性值,但新对象和原始对象不共享相同的内存地址。在深拷贝中,新对象是完全独立的,任何一方对其进行修改都不会影响到其他对象。

浅拷贝示例

下面是一个使用浅拷贝的示例:

import copy

class MyClass:
    def __init__(self, name):
        self.name = name
        self.items = []

    def add_item(self, item):
        self.items.append(item)

obj1 = MyClass('Object 1')
obj1.add_item('Item 1')
obj1.add_item('Item 2')

# 浅拷贝
obj2 = copy.copy(obj1)
obj2.add_item('Item 3')

print(obj1.items) # 输出:['Item 1', 'Item 2', 'Item 3']
print(obj2.items) # 输出:['Item 1', 'Item 2', 'Item 3']

在上面的示例中,我们创建了一个名为 MyClass 的类,该类包含名称属性和一个条目列表。我们创建了一个名为 obj1 的对象,并将两个条目添加到该对象的列表中。然后我们创建了一个名为 obj2 的新对象,并使用浅拷贝将 obj1 的属性值复制到 obj2 中。最后,我们向 obj2 的列表中添加了一个新的条目。然而,由于 obj1 和 obj2 共享相同的条目列表,所以添加的条目在 obj1 的列表中也会出现。

深拷贝示例

下面是一个使用深拷贝的示例:

import copy

class MyClass:
    def __init__(self, name):
        self.name = name
        self.items = []

    def add_item(self, item):
        self.items.append(item)

obj1 = MyClass('Object 1')
obj1.add_item('Item 1')
obj1.add_item('Item 2')

# 深拷贝
obj2 = copy.deepcopy(obj1)
obj2.add_item('Item 3')

print(obj1.items) # 输出:['Item 1', 'Item 2']
print(obj2.items) # 输出:['Item 1', 'Item 2', 'Item 3']

在上面的示例中,我们创建了一个名为 MyClass 的类,该类包含名称属性和一个条目列表。我们创建了一个名为 obj1 的对象,并将两个条目添加到该对象的列表中。然后我们创建了一个名为 obj2 的新对象,并使用深拷贝将 obj1 的属性值复制到 obj2 中。最后,我们向 obj2 的列表中添加了一个新的条目。由于 obj1 和 obj2 完全独立,所以 obj1 中的列表并不受 obj2 的添加操作的影响。

总结

浅拷贝和深拷贝是两种常用的对象复制技术,它们有着明显的区别。当使用浅拷贝时,新对象只是原始对象的一个副本,而当使用深拷贝时,新对象是完全独立的。因此,在选择使用浅拷贝或深拷贝时,需要根据具体的场景来判断哪种拷贝方式更加适合。