Python 简析深拷贝和浅拷贝

    技术2025-09-23  6

    Python 中,将对象进行赋值的方式共有三种:

    直接赋值:直接将对象的引用赋值给等号左边的对象。浅拷贝:复制一份父对象,但不会复制父对象内部子对象。深拷贝:既复制父对象,也复制子对象。

    下面具体来说明。

    直接赋值

    >>> a = [1, 2, [1, 2]] >>> b = a >>> b.append(3) >>> a;b [1, 2, [1, 2], 3] [1, 2, [1, 2], 3] >>> a[2].append(3) >>> a;b [1, 2, [1, 2, 3], 3] [1, 2, [1, 2, 3], 3]

    可以发现,a 与 b 都指向同一个对象,如图所示: 当给列表 b 添加元素 3 以后: 当给列表 a 中的子列表添加元素 3 后:

    浅拷贝

    >>> a = [1, 2, [1, 2]] >>> b = a.copy() >>> a.append(3) >>> a;b [1, 2, [1, 2], 3] # 可以发现 a 与 b 的父对象不是同一个 [1, 2, [1, 2]] >>> a[2].append(3) >>> a;b [1, 2, [1, 2, 3], 3] # 可以发现 a 与 b 中的子对象为同一个对象的引用 [1, 2, [1, 2, 3]]

    浅拷贝过程如图所示。可以发现,a 与 b 所指向的父对象是各自独立的,但是 a 与 b 中的子对象仍为同一个对象: 当给列表 a 添加元素 3 后: 当为列表 a 中的子列表添加元素 3 后:

    深拷贝

    深拷贝需要用到 Python 自带的 copy 模块。

    >>> import copy >>> a = [1, 2, [1, 2]] >>> b = copy.deepcopy(a) >>> a;b [1, 2, [1, 2]] [1, 2, [1, 2]] >>> a.append(3) >>> a;b [1, 2, [1, 2], 3] [1, 2, [1, 2]] >>> b.append(4) >>> a;b [1, 2, [1, 2], 3] [1, 2, [1, 2], 4] >>> a[2].append(3) >>> b[2].append(4) >>> a;b [1, 2, [1, 2, 3], 3] [1, 2, [1, 2, 4], 4]

    深拷贝过程如图所示,可以看到 b 完全拷贝了 a 的父对象以及子对象: 深拷贝示例代码执行完毕后,结果如图所示:

    Processed: 0.012, SQL: 9