-
直接赋值:实际就是对象的引用
-
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象
-
深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象
copy 模块的 赋值、copy.copy( 浅拷贝 )和 copy.deepcopy(深拷贝) 分析:
1、b = a:赋值引用,b和a都指向相同的对象;a变量发生改变,则b变量跟着改变
2、b = a.copy():浅拷贝,a和b是两个独立的对象,但他们的子对象还是指向一个相同的对象;假如a中的子对象L发生变化,则b中的子对象M也会发生变化
3、b = a.deepcopy():深度拷贝,b完全拷贝了a的父对象和其子对象,a和b是两个完全独立的对象,a的改变不会引起b的变化
例:
# 字典赋值、浅拷贝、深拷贝的区别分析
import copy
dict_A = {
'name':'Kobe',
'Honor':['Champion' , 'MVP' , 'AllStar']
}
# 赋值
dict_B = dict_A
# 浅拷贝
dict_C = copy.copy(dict_A)
# 深拷贝
dict_D = copy.deepcopy(dict_A)
# 增加dict_A中的值(非子对象)
dict_A['number'] = 24
# 增加ict_A中子对象的值
dict_A['Honor'].append('DPOY')
print("dict_A字典为:" , dict_A)
# 赋值操作,dict_B和dict_A完全一致
print("赋值dict_B字典为:" , dict_B)
# 浅拷贝,dict_C和dict_A子对象保持一致
print("浅拷贝dict_C字典为:" , dict_C)
# 深拷贝,dict_D和dict_A完全独立
print("深拷贝dict_D字典为:" , dict_D)
输出:
dict_A字典为: {'name': 'Kobe', 'Honor': ['Champion', 'MVP', 'AllStar', 'DPOY'], 'number': 24}
赋值dict_B字典为: {'name': 'Kobe', 'Honor': ['Champion', 'MVP', 'AllStar', 'DPOY'], 'number': 24}
浅拷贝dict_C字典为: {'name': 'Kobe', 'Honor': ['Champion', 'MVP', 'AllStar', 'DPOY']}
深拷贝dict_D字典为: {'name': 'Kobe', 'Honor': ['Champion', 'MVP', 'AllStar']}
参考文档:
https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html