1. 浅拷贝
浅拷贝是对于一个对象的顶层拷贝
通俗的理解是:拷贝了引用,并没有拷贝内容
In [10]: a = [11,22,33] In [11]: b = a In [12]: id(a) Out[12]: 140343572333832 In [13]: id(b) Out[13]: 140343572333832 In [14]: a[0] = 'aa' In [15]: a Out[15]: ['aa', 22, 33] In [16]: b Out[16]: ['aa', 22, 33]
当b = a时,实际上是将a列表的内存地址赋值给了b,那么变量a与变量b指向的是同一内存地址!
2. 深拷贝
深拷贝是对于一个对象所有层次的拷贝(递归)
In [17]: import copy In [18]: c = copy.deepcopy(a) In [19]: id(a) Out[19]: 140343572333832 In [20]: id(c) Out[20]: 140343572336840 In [21]: a Out[21]: ['aa', 22, 33] In [22]: c Out[22]: ['aa', 22, 33] In [23]: a[0] = 11 In [24]: a Out[24]: [11, 22, 33] In [25]: c Out[25]: ['aa', 22, 33]
深拷贝不仅拷贝引用还拷贝值,所以内存地址不一样!
再看下面的代码,进一步理解浅拷贝与深拷贝:
注意:变量e由于用的是深拷贝,所以引用与值都是独立的一份
copy.copy
上面演示了copy.deepcopy的用法,下面看copy.copy的用法:
In [40]: a = [1,2,3] In [41]: b = [4,5,6] In [42]: c = [a,b] In [43]: e = copy.copy(c) In [44]: a.append(4) In [45]: c[0] Out[45]: [1, 2, 3, 4] In [46]: id(c) Out[46]: 140343572344200 In [47]: id(e) Out[47]: 140343588052232
图解:
由于变量e用的是copy.copy(c)的方法,所以只拷贝了列表[a,b]的引用(copy.copy只能拷贝第一层引用),所以变量c与变量e的内存地址是不同的,但当改变[a,b]列表中a列表的值时,发现e变量中的a列表也会改变,说明copy.copy方法只拷贝了列表[a,b]列表的引用,而没有拷贝列表[a,b]中列表a与列表b的引用。实际上列表[a,b]中的两个列表a,b的内存地址还是指向的a与b
copy元组时的特点
copy.copy方法在copy时会自动判断copy的对象是可变类型还是不可变类型,如果是不可变类型,那么直接将引用指向copy的对象,如果是可变类型,那么只拷贝第一层的引用,后面的引用不会拷贝
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦