首页 > 其他 > 详细

深浅拷贝

时间:2019-12-25 16:27:49      阅读:99      评论:0      收藏:0      [点我收藏+]

#浅拷贝(复制一份,就相当于抄一遍)

list1 = [‘赤,橙,黄,绿,青,蓝,紫‘]
list2 = list1[:] #切片会产生一个新的列表
list3 = list1.copy() #浅拷贝
print(id(list1))
print(id(list2))
print(id(list3))

结果内存地址都不一样:
内存地址 3276933495680
内存地址 3276963987136 
内存地址 3276963986880
浅拷贝如图示范:
1 list1 数据为列表 [赤,橙,黄,绿,青,蓝,紫 ] 内存地址为1a1b list1指针指向内存地址1a1b list1的数据改变不会影响到list2
2 list2 执行切片 或者 copy的时候,会产生一个新的列表 内存地址为2a2b list2指针指向2a2b
技术分享图片

 注意浅拷贝的另外一种情况:  list1的数据改变为什么会影响到list2 ?  浅拷贝不是说只是复制一份吗? 在浅拷贝后;追加的list3.append(‘蓝‘) 为什么list2还是会有"蓝"? 看图解释

list1 = [‘赤‘,‘橙‘,‘黄‘,[‘青‘]]
list2 = list1.copy()
list1[3].append("蓝")
print(list1) [‘赤‘, ‘橙‘, ‘黄‘, [‘青‘, ‘蓝‘]]
print(list2) [‘赤‘, ‘橙‘, ‘黄‘, [‘青‘, ‘蓝‘]]

从图中可以看出来,[‘青‘] 在嵌套列表中还是一个内存地址,当list2浅拷贝list1的内容适合,实际是[‘赤‘,‘橙‘,‘黄‘,内存地址3a3b],
当list1进行list1[3].append("蓝")的时候,实际是修改的这个3a3b内存地址内容,list2读3a3b内存地址发现是指向的[‘青‘,‘蓝‘],所以内容也会改变.

 技术分享图片

 


 验证内存地址一样

print(id(list1[3])) 
print(id(list2[3]))

 

深拷贝 

1 #深拷贝需要使用copy模块

import copy
list1 = [‘赤‘,‘橙‘,‘黄‘,[‘青‘]]
list2 = copy.deepcopy(list1) #深拷贝,简单来说就是全部复制一份
list1[3].append("蓝")
print(id(list1[3])) 内存地址跟list2[3]不一样
print(id(list2[3])) 内存地址跟list1[3]不一样

print(list1[3])
print(list2[3])

   如图示:深浅拷贝最大的区别在[‘青‘]这个对象,如果是浅拷贝list1 和 list2 列表中的 [‘青‘]对象内存地址是同一个,如果是深拷贝, [‘青‘]对象内存地址在深拷贝的时候,会重新拷贝一份新的产生一个新的内存地址,list1 和list2 2个数据从此再无关联 

  深拷贝,就类似于,我要制作一个孙悟空,我连孙悟空的师傅师弟全部做一份新的,  浅拷贝;我新制作一个孙悟空,但是师傅师弟还是用同一份

技术分享图片

 

 

 总结:

  赋值操作,没有创建对象

  浅拷贝,只拷贝第一层  使用切片[:] or copy() 做浅拷贝操作

    深拷贝,把这个对象内容以及内部的所有内容全部拷贝一遍,使用copy模块

 


 

深浅拷贝

原文:https://www.cnblogs.com/ajaxa/p/12096610.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!