Python中的深拷贝与浅拷贝

1. 深拷贝与浅拷贝的概念

在 Python 中,赋值操作是通过引用来实现的。当我们将一个对象赋值给一个新的变量时,实际上是将该对象的引用赋给了新变量。因此,修改新变量会影响到原始对象。然而,有时我们希望创建一个新的对象并拷贝原始对象的值,而不是引用。这就引出了深拷贝和浅拷贝的概念。

  • 浅拷贝(Shallow Copy):创建一个新的对象,并将原始对象的引用复制给新对象。这意味着新对象和原始对象共享相同的内存地址。当修改其中一个对象时,另一个对象也会受到影响。
  • 深拷贝(Deep Copy):创建一个新的独立对象,并将原始对象的值复制给新对象。这意味着新对象和原始对象是完全独立的,修改其中一个对象不会影响到另一个对象。

2. 实现深拷贝与浅拷贝的步骤

下面是实现深拷贝和浅拷贝的步骤:

步骤 描述
1 导入 copy 模块
2 创建原始对象
3 执行浅拷贝或深拷贝操作

3. 示例代码

首先,我们需要导入 copy 模块,用于实现拷贝操作。

import copy

接下来,我们创建一个原始对象 original_obj,包含一个列表和一个字典。

original_obj = {'name': 'Alice', 'age': 25, 'hobbies': ['reading', 'painting']}

3.1 浅拷贝

浅拷贝可以使用 copy 模块的 copy() 函数来实现。

shallow_copy_obj = copy.copy(original_obj)

上述代码会创建一个新的对象 shallow_copy_obj,并将原始对象 original_obj 的引用复制给它。这意味着两个对象共享相同的内存地址。

3.2 深拷贝

深拷贝可以使用 copy 模块的 deepcopy() 函数来实现。

deep_copy_obj = copy.deepcopy(original_obj)

上述代码会创建一个新的独立对象 deep_copy_obj,并将原始对象 original_obj 的值复制给它。这意味着两个对象是完全独立的,修改其中一个对象不会影响另一个对象。

4. 类图

下面是示例代码的类图表示:

classDiagram
    class OriginalObj {
        - name: str
        - age: int
        - hobbies: list
        + __init__(name: str, age: int, hobbies: list)
        + get_name() -> str
        + get_age() -> int
        + get_hobbies() -> list
    }

    class ShallowCopyObj {
        - original_obj: OriginalObj
        + __init__(original_obj: OriginalObj)
        + get_original_obj() -> OriginalObj
    }

    class DeepCopyObj {
        - original_obj: OriginalObj
        + __init__(original_obj: OriginalObj)
        + get_original_obj() -> OriginalObj
    }

    OriginalObj <|-- ShallowCopyObj
    OriginalObj <|-- DeepCopyObj

5. 总结

通过上述步骤,我们可以实现在 Python 中进行深拷贝和浅拷贝的操作。浅拷贝会创建一个新的对象,并将原始对象的引用复制给新对象。深拷贝会创建一个新的独立对象,并将原始对象的值复制给新对象。根据需求选择合适的拷贝方式,可以避免由于共享引用导致的意外修改原始对象的问题。