欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python 简析深拷贝和浅拷贝

程序员文章站 2022-06-30 07:54:23
Python 深拷贝和浅拷贝Python 中,将对象进行赋值的方式共有三种:直接赋值:直接将对象的引用赋值给等号左边的对象。浅拷贝:复制一份父对象,但不会复制父对象内部子对象。深拷贝:既复制父对象,也复制子对象。下面具体来说明。直接赋值>>> a = [1, 2, [1, 2]]>>> b = a>>> b.append(3)>>> a;b[1, 2, [1, 2], 3][1, 2, [1, 2], 3]...

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 都指向同一个对象,如图所示:
Python 简析深拷贝和浅拷贝
当给列表 b 添加元素 3 以后:
Python 简析深拷贝和浅拷贝
当给列表 a 中的子列表添加元素 3 后:
Python 简析深拷贝和浅拷贝

浅拷贝

>>> 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 中的子对象仍为同一个对象:
Python 简析深拷贝和浅拷贝
当给列表 a 添加元素 3 后:
Python 简析深拷贝和浅拷贝
当为列表 a 中的子列表添加元素 3 后:
Python 简析深拷贝和浅拷贝

深拷贝

深拷贝需要用到 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 的父对象以及子对象:
Python 简析深拷贝和浅拷贝
深拷贝示例代码执行完毕后,结果如图所示:
Python 简析深拷贝和浅拷贝

本文地址:https://blog.csdn.net/shaotianyang12/article/details/107126498