python中深浅拷贝的区别,python中深拷贝和浅拷贝
python深度复制和浅复制的区别深度复制在Python中经常使用,其区别的外在表现是:
使用浅层复制,当原始容器对象中的可变对象中的元素发生变化时,复制的对象也会发生变化。而使用深度复制的时候,就不会有这个问题了。
轻拷贝:# -*-编码:utf-8 -*-# @File: light copy.py # @作者:runpengzhang # @日期:2020/2/10 # @ desc: demo介绍深度拷贝和轻拷贝的区别。这个文件演示了light copy # copy light copy,没有复制子对象,所以原来的子对象会改变一个由import copy#定义的列表,其中第一个元素是可变类型list1=[[1,2], fei , 67]# Make light copy list 2=copy . copy(list 1)#对象的地址是否相同print (ID (list1)) 对象的地址不同23138072463442313789591048 #第一个元素的地址是否相同print (ID (ID )) print(id(list2[0]) 结果是否相同23138072702162313807270216 。 复制的对象也发生了变化[[2,2], Fei ,66] #更改第二个值,检查复制对象的变化list1[1]=geprint(list2 Fei ,66] 深度复制# -*-编码:utf-8 -*-# @File: deep copy.py # @作者:run Peng Zhang # @ date:2020/2/10 # @ desc:演示介绍了深度复制和轻度复制的区别。 该文件演示了深层复制。在对象内部包含来自对象的副本,因此原始对象的更改不会导致深层副本中任何子元素的更改。import copy#定义了一个列表,其中第一个元素是可变类型list1=[[1,2], fei ,67] # Do深度复制list2=copy.deepcopy (list1) #对象的地址是否相同print(id(list1))print(id(list2)) 对象的地址不同23138072463442313789591048 #更改第一个值,检查复制对象list1[0][0]=2print 66] #更改第二个值并检查复制对象list 1[1]= ge print(list 2) Fei ,66] 分析当我们声明list 1=[ a , b],1,2]时,计算机做这些事情:
1.在内存中打开一个空间来存储字符A和B,数字1和2。
2.在内存中打开一个空间来存储一个列表,我们称之为list2。list2中存储了两个指针,分别指向字符A和B。
3.在内存中打开一个空间存储一个list lsit1,里面存储三个指针,分别指向list2,number 1,number 2。
当执行light copy lsit3=copy.copy(list1)时,计算机会打开一段内存来存储list3的三个指针,分别指向list2、number 1和number 2。执行list1[0][0]=c 时,list2对象被修改,而list3的第一个指针指向list2,所以我们看到list3的第一个元素也发生了变化。
当执行深层拷贝lsit4=copy.copy(list1)时,计算机为list4打开一段内存。与浅拷贝不同,计算机还为新列表开辟了一段空间,称为lsit5。list5中保存了两个指针,分别指向字符A和B。
同时,list4存储了三个指针,分别指向list5、数字1和数字2。此时,当执行list1[0][0]=c 时,list2对象被修改,但list4的第一个指针指向list5,没有被修改,所以list4不变。
总结:深拷贝会把可变对象也拷贝一份,而浅拷贝不会。
上面的例子是一个list(可变对象)的副本,但是元组、字符等不可或缺的对象呢?
答案是对不可不对象,其实不存在深浅拷贝的问题。无论怎么拷贝,效果都是新建立一个指向不可变对象的指针而已。。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。