Python深浅拷贝
一、拷贝(赋值)
lt = [1,2,3,4,5]
lt2 = lt
lt.append(6)
print(lt)
# 因为列表是可变类型, 所以lt的值变化,lt2值也会跟着变化
print(lt2)
print(id(lt))
print(id(lt2))
结果: [1,5,6] [1,6]
2304711549576 2304711549576

二、浅拷贝
-
添加值不发生变化 import copy
lt = [100,200,300,[400,500,600]]
lt2 = copy.copy(lt)
# 没有变化情况
lt.append(700)
print(lt)
print(lt2) 结果: [100,600],700] [100,600]]
-
添加值发生变化 import copy
lt = [100,600]]
lt2 = copy.copy(lt)
# 变化情况
print('id(lt)',id(lt))
print('id(lt[0])',id(lt[0]))
print('id(lt[1])',id(lt[1]))
print('id(lt[2])',id(lt[2]))
print('id(lt[3])',id(lt[3]))
print('*' * 50)
print('id(lt2)',id(lt2))
print('id(lt2[0])',id(lt2[0]))
print('id(lt2[1])',id(lt2[1]))
print('id(lt2[2])',id(lt2[2]))
print('id(lt2[3])',id(lt2[3]))
print('*' * 50)
lt[-1].append(700)
print(lt)
print(lt2) 结果:(浅拷贝,lt和lt2的id不一样,lt[-1]和lt[-1]一样) id(lt) 1520433324744 id(lt[0]) 140712889544624 id(lt[1]) 140712889547824 id(lt[2]) 1520433550832 id(lt[3]) 1520433324680
id(lt2) 1520715912264 id(lt2[0]) 140712889544624 id(lt2[1]) 140712889547824 id(lt2[2]) 1520433550832 id(lt2[3]) 1520433324680
[100,600,700]] [100,700]] 
三、深拷贝
import copy
lt = [100,600]]
lt2 = copy.deepcopy(lt)
print('id(lt)',id(lt[3]))
print('*' * 50)
print('id(lt2)',id(lt2[3]))
print('*' * 50)
lt.append(70)
print(lt)
print(lt2)
print("*" * 50)
lt2[-1].append(7000)
print(lt)
print(lt2)
结果:
id(lt) 1585269859016 id(lt[0]) 140712889544624 id(lt[1]) 140712889547824 id(lt[2]) 1585270085104 id(lt[3]) 1585269858952
id(lt2) 1585552380680 id(lt2[0]) 140712889544624 id(lt2[1]) 140712889547824 id(lt2[2]) 1585270085104 id(lt2[3]) 1585299572040
[100,70] [100,600]]
[100,7000]]

四、总结
- 拷贝:当lt2为lt的拷贝对象时, lt内可变类型变化,lt2变化;lt内的不可变类型变化,lt2变化(简单赋值)
- 浅拷贝:当lt2为lt的拷贝对象时,lt内可变类型变化,lt2变化;lt内不可变类型变化,lt2不变化(copy.copy())
- 深拷贝:当lt2为lt的拷贝对象时, lt内的可变类型变化,lt2不变化;lt内不可变类型变化,lt2不变化(copy.deepcopy())
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|