当前位置: 首页 > 科技观察

Python中的图解深浅拷贝(copy)

时间:2023-03-17 13:30:15 科技观察

,工作中经常会涉及到数据传输。在数据传输过程中,数据可能会被修改。为了防止数据被修改,需要传递一个副本,即使修改了副本,也不会影响原始数据的使用。为了制作这个副本,制作了一个副本。今天就来聊一聊Python中的深浅拷贝问题。1.深拷贝1.赋值操作l1=[1,2,3,[22,33]]l2=l1l1.append(666)print(l1)#[1,2,3,[22,33],666]print(l2)#[1,2,3,[22,33],666]图解:注:l2=l1是一个指针,是一个赋值,与拷贝深度无关。2.浅拷贝其实就是一个slot列表,每个slot中存放的是对象的内存地址#例1.添加元素l1=[1,2,3,[22,33]]l2到一个大列表=l1.copy()#或者下面的方法是浅拷贝#importcopy#l2=copy.copy(l1)l1.append(666)print(l1)#[1,2,3,[22,33],666]print(l2)#[1,2,3,[22,33]]#例2.向小列表添加元素l1=[1,2,3,[22,33]]l2=l1.copy()l1[-1].append(666)print(l1)#[1,2,3,[22,33,666]]print(l2)#[1,2,3,[22,33,666]],例3.改l1列表中的第一个元素到6l1=[1,2,3,[22,33]]l2=l1.copy()l1[0]=6print(l1)#[6,2,3,[22,33]]print(l2)#[1,2,3,[22,33]]图:例1例2例3总结:浅拷贝:会在内存中创建一个新的空间来存放这个拷贝列表,但是列表中的内容仍然使用前一个对象的内存地址。3.深拷贝importcopyl1=[1,2,3,[22,33]]l2=copy.deepcopy(l1)l1.append(666)print(l1)#[1,2,3,[22,33],666]print(l2)#[1,2,3,[22,33]]Diagram:本质如下图所示:但是python对深拷贝做了优化,在内存中重新创建一个可变数据类型,不可变数据类型会继续使用之前的,所以内存如下:总结:深拷贝:会在内存中开辟一块新的空间,重新创建原来的链表和链表中的可变数据类型,immutable数据类型继承于上一个。为什么Python默认的拷贝方式是浅拷贝?时间观点:浅拷贝花费的时间更少。空间视角:浅拷贝占用内存少。从效率的角度:浅拷贝只拷贝顶层数据,一般比深拷贝效率更高。总结:不可变对象在分配时会开辟新的空间。当一个可变对象被赋予一个值时,修改其中一个的值将改变另一个。深拷贝和浅拷贝复制不可变对象时,并没有开辟新的空间,相当于一个赋值操作。浅拷贝在复制的时候只复制第一层的引用。如果元素是一个可变对象并且被修改,复制的对象也会改变。深拷贝时,会一层层拷贝,直到所有的引用都是不可变对象。Python有很多种实现浅拷贝的方法,copy模块的copy函数,对象的copy函数,工厂方法,slice等,大多数情况下,在写程序的时候,除非有特殊需要,都会使用浅拷贝。浅拷贝的优点:拷贝速度快,占用空间少,拷贝效率高。