说到什么是深浅拷贝,就不得不说python中赋值的含义,赋值并不是拷贝,而是将target(变量名)和object(对象本身)建立了一种联系,当一个object可变时,连接该object的任意一个target改变该object值都会影响其他连接该object的target的取值。如:
>>> a=[1,2,3] >>> b=a >>> b[0]=0 >>> b [0, 2, 3] >>> a [0, 2, 3]
那如果只想改变一个mutable object的值,而它原来的值还保留,该怎么办呢?答案就是拷贝,通过python 内建库copy。
而拷贝又分为深拷贝(copy.deepcopy)和浅拷贝(copy.copy),深浅拷贝的区别在于对“复合对象”(即该对象还包含了其他对象,如list,dict等)时拷贝的不同:
对于浅拷贝,新建一个“复合对象”,该对象包含的是被拷贝对象的reference;
对于深拷贝,新建一个“复合对象”,尽量的把被拷贝对象中含有的对象全都深拷贝;
如:
-------------------------shallow copy------------------- >>> a=[1,2,3] >>> c=a.copy() >>> c [0, 2, 3] >>> c[0]=4 >>> c [4, 2, 3] >>> a [0, 2, 3] >>> d=[[0,1],2,3] >>> e=d.copy() >>> e[0][0]=100 >>> e [[100, 1], 2, 3] >>> d [[100, 1], 2, 3] ----------------------deep copy-------------------------- >>> import copy >>> f=copy.deepcopy(d) >>> d [[100, 1], 2, 3] >>> f [[100, 1], 2, 3] >>> f[0][0]=5 >>> f [[5, 1], 2, 3] >>> d [[100, 1], 2, 3] >>> g=[[[1],2]] >>> h=copy.deepcopy(g) >>> h[0][0][0]=100 >>> h [[[100], 2]] >>> g [[[1], 2]]
当然,对于list,dict自身的copy方法都是shallow copy