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是同赋值操作一样,数值同步的。

原文地址:https://www.cnblogs.com/hongdanni/p/10458796.html