郑统京 发表于 2022-10-30 23:56:45

深浅copy底层原理

浅拷贝:    本质:会不加区分的把原来的内存地址拷贝过来,哪怕里面包含         可变类型的元素,也不会做额外处理import copy

l1=[111,222,[333,444]]
l2=copy.copy(l1)

l1[0]=444
l1[1]=555
# l1=666
# l1=777
print(l2) # ]
print(id(l1[0]),id(l1[1]),id(l1[2])) # 1463079249520 1463081621680 1463081822976
print(id(l2[0]),id(l2[1]),id(l2[2])) # 140703488021616 140703488025168 1463081822976#1、每个内存地址都会绑定一个值,如果这个内存地址绑定值发生改变了,那么就和原来的值取消绑定,自身产生新的内存地址和值进行绑定,这里的l1可以看出来当发生改变了,内存地址也会变的,再次打印l2的时候,还是指向l1未改变内存地址对应的值,
2、但是如果对于l1,l1共用的是一个内存地址(容器好理解一点),然后这个没有直接对内存地址绑定的值进行改变,容器本身是不会因为里面的值变化而变化的当我们访问的时候是通过容器>>>内存地址>>值,只要容器存在,就会直接访问里面对应的内存地址绑定的值,不存在改了值容器就发生改变的情况了,也就不会出现l1改变了内存地址的值,内存地址就变化的情况,l2拷贝的值也会改变的现象,理论上是不会改变的才对

深拷贝l2=copy.deepcopy(l1)print(id(l1[0]),id(l1[1]),id(l1[2])) # 140703488021616 140703488025168 2561390537472
print(id(l2[0]),id(l2[1]),id(l2[2])) # 140703488021616 140703488025168 2561390538048#这里可以看到深拷贝,在拷贝数据有可变类型的时候,对于l1中列表的地址已经加以分区的拷贝了,和上面的情况就完全相反了,l1改的容器,本身就和l2的容器不是一个,你l1怎么改,都不会影响l2的变化的了













页: [1]
查看完整版本: 深浅copy底层原理