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 都指向同一个对象,如图所示:
当给列表 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 的父对象以及子对象:
深拷贝示例代码执行完毕后,结果如图所示:
本文地址:https://blog.csdn.net/shaotianyang12/article/details/107126498
下一篇: 没域名、没主机、没程序?也能建网站!