对于各种编程语言,深浅拷贝总可以让初学者头疼不已。而--这门十分受欢迎的语言也不例外。下面,分享下自己对Python深浅拷贝的理解。

- 浅复制后,两个变量同时变化
- 深复制后,两个变量独立
单变量
在编程中,赋值“=”这个操作很常见,但是它底层的含义学问很大。稍有不注意,就给你找麻烦。赋值“=”类似于深复制。直接上code
>>> x = 10 >>> y = x >>> x, y 10, 10 >>> x = 0 >>> print(x, y) 0, 10
发现,y的值没有变化!!!也说明y = x 这个赋值操作并没有实现把x的地址赋值给y,而是创造了一个引用。x,y的值是独立的,不会相互影响。直接上图助你理解引用。
- 10赋值给x,10的引用给了x
- y=x,给10创造了一个引用别名
- x=0,0的引用给了x,从而不会影响y的值
复杂数据结构,例如 List, Array
但对于复杂数据结构的赋值和单变量的不一样,它是一种浅复制。直接上code
>>>ls1 = [0,1,2] >>>ls2 = ls1 >>>ls1.end(-1) >>> ls1, ls2 [0,1,2,-1],[0,1,2,-1]
赋值后,两个变量是同时改变的。这和单变量的不同。
可以这样理解,对于复杂数据结构的赋值,其实是数据结构地址的赋值,即ls1和ls2共享了这个list的地址,都指向这个数据结构。所以,一个变化后,另一个也会变化。类比说明下,假设黄山市和徽州市(徽州更好听)是同一个地方的名称,都指向同一个地点。徽州市实现了小康,那黄山市肯定也是小康了。
深复制
那么,如何实现复杂数据结构的复制呢?使用Python的一个包:copy.
- copy.copy() 实现浅复制
- copy.deepcopy() 实现深复制
>>>import copy >>> ls1 = [0,1,2] >>>ls2 = copy.deepcopy(ls1) >>>ls1.append(-1) >>>ls1,ls2 ([0, 1, 2, -1], [0, 1, 2])胜象大百科








