本文已参与周末学习计划,点击链接查看详情:周末学习
(一)
当通过布尔索引从txt读取指定数组时,发现有的方法会修改原数组,有的就不会。后来发现是深拷贝和浅拷贝的问题。
先导入 copy 模块:
import copy
复制代码
然后创建列表a
a=[1,2,3]
复制代码
然后将a赋值给b:
b = a
print(b)
复制代码
输出:
直接赋值,其实就是对象的引用(别名)。
最简单的往 b 中插入一个东西,并输出 a 和 b:
改变 b,a 也跟着改变,这个就是浅拷贝(shallow copy),拷贝父对象,不会拷贝对象的内部的子对象。
我们通过 copy.deepcopy 方法实现 c 对 a 的深拷贝:
深拷贝(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