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