python之浅拷贝深拷贝

Posted

tags:

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

之前一直不明白python中的浅拷贝和深拷贝是个鸟意思,通过一段时间的学习,总算是明白了些,所以就写出来让自己加深点印象,并在与大家分享和交流!

#浅拷贝命令
copy.copy(x)     
Return a shallow copy of x.
返回一个个浅拷贝 x
#深拷贝命令
copy.deepcopy(x)
Return a deep copy of x.
返回一个深拷贝 x

浅拷贝新创建一个对象并且插入到与之相关的对象或者引用者的身上。
深拷贝同样是创建一个新对象,但是是递归拷贝对象,并且插入到相关的对象或者引用者的身上。深拷贝存在着两个问题,是什么呢?
1、递归拷贝对象的时候可能导致循环递归。
2、因为深拷贝对什么都拷贝,所以拷贝的对象太多,数据管理结构会在彼此之间分享。
这两句话是什么意思呢?理解起来太难,但是例子会让我们明白许多     
>>>a ={‘a‘: 1, ‘c‘: {‘e‘: 4, ‘d‘: 3}, ‘b‘: 2, ‘f‘: 5
}>>> a
{‘a‘: 1, c: {e: 4, d: 3}, b: 2, f: 5} #输出结果
>>>b = copy.copy(a) #把a浅拷贝给b=
>>> b
{a: 1, c: {e: 4, d: 3}, b: 2, f: 5} #输出结果,和a是一样的吧,别急一会就回有变化啦!
>>> a[a]="2" #我把a给更改一下
>>> a
{‘a‘: ‘2‘, c: {e: 4, d: 3}, b: 2, f: 5} #这是更改完后的结果,a=1变成a=2了吧
>>> b
{a: 1, c: {e: 4, d: 3}, b: 2, f: 5} #此时的b a=1没变,别急接下来再次更改a,但是更改不同的部分
>>> a[c][e]=100 #更改a
>>> a
{a: 2, c: {e: 100, d: 3}, b: 2, f: 5} #输出更改后的结果
>>> b
{a: 1, c: {e: 100, d: 3}, b: 2, f: 5} #现在再看看b的结果,哎呀,刚才a更改,b没变,而现在却跟着a变化了呢,为什么呢?哎,对啦,这就是所谓的浅拷贝原理啊,再看一个例子
>>>a = [‘a‘,‘b‘,1,[‘c‘,‘2‘],‘d‘]
>>> a[‘a‘, ‘b‘, 1, [‘c‘, ‘2‘], ‘d‘]
>>> b = copy.copy(a)
>>> b
[‘a‘, ‘b‘, 1, [‘c‘, ‘2‘], ‘d‘]
又写了个列表的例子,我想说其实是个上面的字典是一样的,好嘞,接着说浅拷贝,顾名思义的想一想,浅就是表面呗,看看上面的例子可以知道,仅仅是把列表(字典)的表面那一层拷贝啦(就是又复制了一个副本给b啦),里面嵌套的列表其实a和b还在公用着,没有说再复制个副本出来给b,表面的那一层列表在内存中又开辟出了一块内存空间,而嵌套的那层列表没有动。
#深拷贝
>>> c = copy.deepcopy(a)
>>> a
{a: 2, c: {e: 100, d: 3}, b: 2, f: 5}
>>> c
{a: 2, c: {e: 100, d: 3}, b: 2, f: 5}
>>> c[a]=20
>>> c
{a: 20, c: "{‘e‘: 100, ‘d‘: 3}", b: 2, f: 5}
>>> a
{a: 2, c: {e: 100, d: 3}, b: 2, f: 5}
>>> c[c][e]=200
>>> c
{a: 2, c: {e: 200, d: 3}, b: 2, f: 5}
>>> a
{a: 2, c: {e: 100, d: 3}, b: 2, f: 5}
#深拷贝就不多说啦,它是递归嘛,就是不管你嵌套多少列表(字典)它都会给你复制一份给别人的(无论浅层的后者深层的对象都会给它们开辟新的内存空间,但是类型是不变的,所谓类型不变就是原来的对象是列表(字典)浅拷贝或者深拷贝完,依然是列表(字典))

 

 

 

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

Python之浅拷贝和深拷贝

NumPy之浅拷贝和深拷贝

python之浅拷贝和深拷贝

React之浅拷贝与深拷贝

lua踩坑之浅拷贝与深拷贝

小tips:JS之浅拷贝与深拷贝