热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:python之浅拷贝与深拷贝

篇首语:本文由编程笔记#小编为大家整理,主要介绍了python之浅拷贝与深拷贝相关的知识,希望对你有一定的参考价值。1.浅拷贝浅拷贝是对于一个

篇首语:本文由编程笔记#小编为大家整理,主要介绍了python之浅拷贝与深拷贝相关的知识,希望对你有一定的参考价值。



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的对象,如果是可变类型,那么只拷贝第一层的引用,后面的引用不会拷贝


推荐阅读
author-avatar
童月圆524
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有