python中的深复制与浅复制
- 2019 年 11 月 20 日
- 筆記
在使用python对数据对预处理,比如归一化、去噪时,发现处理后的数据会有诡异的 现象,比如全部都是一样的,或者某些都是一样的。
调查了一番之后,发现这是由于python中的深浅复制造成的。其实,归根结底这与python中的内存分配与管理方式有关。
下面对不同的复制做出结论。
直接引用
类似于a=[1,2,3] b = a
, 这样的都是直接引用,b的值会随着a值的变动而变动
切片复制
切片复制主要是a=[1, 2, 3] b=a[:]
, 当被复制的对象内部只是基本类型而没有嵌套类型时,切片复制可以实现两个对象的隔离。
注意,嵌套类型指的是列表中还有列表,字典中嵌套列表等等复杂类型。
浅复制
指的是b = copy.copy(a)
的情况,对简单类型有用
深复制
指的是b = copy.deepcopy(a)
的情况,就是你所想象的两个对象互不影响的复制。
完整测试
#encoding:utf-8 import numpy as np import copy a = [1, 2 , 3, [4, 5]] reference_a = a slice_copy_a = a[:] shallow_copy_a = copy.copy(a) deep_copy_a = copy.deepcopy(a) # print original print('Original a istt ', a) # 修改a的基本元素 a[0] = 100 # 修改a的复杂元素 a[3][0] = 1000 print('Now a is tt', a) print('reference_a istt', reference_a) print('shallow copy istt ', shallow_copy_a) print('slice copy is tt', slice_copy_a) print('deep copy is tt', deep_copy_a)
Reference: