浅谈Python深浅拷贝

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

  • 浅复制后,两个变量同时变化
  • 深复制后,两个变量独立
单变量在编程中,赋值“=”这个操作很常见,但是它底层的含义学问很大 。稍有不注意,就给你找麻烦 。赋值“=”类似于深复制 。直接上code
>>> x = 10>>> y = x>>> x, y10, 10>>> x = 0>>> print(x, y) 0, 10发现,y的值没有变化!!!也说明y = x 这个赋值操作并没有实现把x的地址赋值给y,而是创造了一个引用 。x,y的值是独立的,不会相互影响 。直接上图助你理解引用 。
浅谈Python深浅拷贝

文章插图
 
  • 10赋值给x,10的引用给了x
  • y=x,给10创造了一个引用别名
  • x=0,0的引用给了x,从而不会影响y的值
复杂数据结构,例如 List, Array但对于复杂数据结构的赋值和单变量的不一样,它是一种浅复制 。直接上code
>>>ls1 = [0,1,2]>>>ls2 = ls1>>>ls1.Append(-1)>>> ls1, ls2[0,1,2,-1],[0,1,2,-1]赋值后,两个变量是同时改变的 。这和单变量的不同 。
【浅谈Python深浅拷贝】可以这样理解,对于复杂数据结构的赋值,其实是数据结构地址的赋值,即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])



    推荐阅读