python浅拷贝和深拷贝
>>> import copy >>> a = [0,1,2,[3,4]] >>> b = a # 赋值 >>> c = a[:] #浅拷贝(又叫影子拷贝) >>> d = copy.copy(a) #浅拷贝 >>> e = a.copy() #浅拷贝 >>> f = copy.deepcopy(a) # 深拷贝
#父对象的修改
>>> a.append(10) >>>a [0, 1, 2, [3, 4], 10] >>> b [0, 1, 2, [3, 4], 10] >>> c [0, 1, 2, [3, 4]] >>> d [0, 1, 2, [3, 4]] >>> e [0, 1, 2, [3, 4]] >>> f [0, 1, 2, [3, 4]]
#子对象的修改
>>> a[3].append(5) >>>a [0, 1, 2, [3, 4, 5], 10] >>> b [0, 1, 2, [3, 4, 5], 10] >>> c [0, 1, 2, [3, 4, 5]] >>> d [0, 1, 2, [3, 4, 5]] >>> e [0, 1, 2, [3, 4, 5]] >>> f [0, 1, 2, [3, 4]]
由上面两个例子可以理解为并总结出:
a = b赋值操作:就是将变量a的引用地址拷贝过去,即a的另一个别名;对a或者b的操作是对同一个地址下的元素进行操作,所以返回的结果都是一样的,数值同步。
f = copy.deepcopy()深拷贝:就是将父对象及父对象下的子对象的所有元素值都拷贝过去,对a或者对f的操作都是各自对不同地址下的元素进行操作,互不影响。
c = a[:],a.copy(),copy.copy(a)都是浅拷贝的形式:将变量a内的所有父对象的值拷贝过去,但是对于父对象内的子对象值(例如列表内的各个元素值)没有进行拷贝,只是拷贝了列表所指向的地址值。
所以介于赋值操作和深拷贝之间:对于a或者c的父对象的操作,a和c是同深拷贝一样互不影响的;对于子对象的操作,a和c是同赋值操作一样,数值同步的。