简述python中的深浅拷贝

Posted JohnYang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简述python中的深浅拷贝相关的知识,希望对你有一定的参考价值。

说到什么是深浅拷贝,就不得不说python中赋值的含义,赋值并不是拷贝,而是将target和object建立了一种联系,当一个object可变时,连接该object的任意一个target改变该object值都会影响其他连接该object的target的取值。如:

>>> a=[1,2,3]
>>> b=a
>>> b[0]=0  
>>> b
[0, 2, 3]
>>> a
[0, 2, 3]

 那如果只想改变一个mutable object的值,而它原来的值还保留,该怎么办呢?答案就是拷贝,通过python 内建库copy。

而拷贝又分为深拷贝(copy.deepcopy)和浅拷贝(copy.copy),深浅拷贝的区别在于对“复合对象”(即该对象还包含了其他对象,如list,dict等)时拷贝的不同:

对于浅拷贝,新建一个“复合对象”,该对象包含的是被拷贝对象的reference;

对于深拷贝,新建一个“复合对象”,尽量的把被拷贝对象中含有的对象全都深拷贝;

如:

-------------------------shallow copy-------------------
>>> a=[1,2,3]
>>> c=a.copy()
>>> c
[0, 2, 3]
>>> c[0]=4
>>> c
[4, 2, 3]
>>> a
[0, 2, 3]

>>> d=[[0,1],2,3]
>>> e=d.copy()
>>> e[0][0]=100
>>> e
[[100, 1], 2, 3]
>>> d
[[100, 1], 2, 3]

----------------------deep copy--------------------------
>>> import copy
>>> f=copy.deepcopy(d)
>>> d
[[100, 1], 2, 3]
>>> f
[[100, 1], 2, 3]
>>> f[0][0]=5
>>> f
[[5, 1], 2, 3]
>>> d
[[100, 1], 2, 3]


>>> g=[[[1],2]]
>>> h=copy.deepcopy(g)
>>> h[0][0][0]=100
>>> h
[[[100], 2]]
>>> g
[[[1], 2]]

 当然,对于list,dict自身的copy方法都是shallow copy

 

以上是关于简述python中的深浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

简述python赋值深浅拷贝

python中常用模块总概括以及深浅拷贝简述

Python的深浅copy

简述深浅拷贝

简述深浅拷贝原理

python深浅拷贝