深拷贝和浅拷贝 | 周末学习

本文已参与周末学习计划,点击链接查看详情:周末学习

(一)

当通过布尔索引从txt读取指定数组时,发现有的方法会修改原数组,有的就不会。后来发现是深拷贝和浅拷贝的问题。

image.png

先导入 copy 模块:

import copy
复制代码

然后创建列表a

a=[1,2,3]
复制代码

然后将a赋值给b:

b = a
print(b)
复制代码

输出:

image.png

直接赋值,其实就是对象的引用(别名)。
最简单的往 b 中插入一个东西,并输出 a 和 b:

image.png

改变 b,a 也跟着改变,这个就是浅拷贝(shallow copy),拷贝父对象,不会拷贝对象的内部的子对象。
我们通过 copy.deepcopy 方法实现 c 对 a 的深拷贝:

image.png

深拷贝(deepcopy),利用 copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
如果上面的都记不住,那就记:

浅拷贝,一变都变。
深拷贝,各自独立。

(二)

另外,Pandas中的拷贝方法也是很高效的。

DataFrame.copy(deep=True)

复制此对象的索引和数据。

当deep=True(默认)时,将使用调用对象的数据和索引的副本创建新对象。对副本的数据或索引的修改不会反映在原始对象中(请参阅下面的注释)。

当deep=False,将创建一个新对象而不复制调用对象的数据或索引(仅复制对数据和索引的引用)。对原始数据的任何更改都将反映在浅层副本中(反之亦然)。

Notes

当deep=True,数据被复制但实际的Python对象不会被递归复制,只能引用该对象。这与标准库中的copy.deepcopy形成对比,后者以递归方式复制对象数据。

在Index复制对象时deep=True,由于性能原因,不会复制基础numpy数组。由于Index是不可变的,因此可以安全地共享基础数据并且不需要副本。

参考文档

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享