pythoncopy和deepcopy_Python中的Copy和Deepcopy
一,Python的对象:
Python存在大量的对象,我们一般提到的对象都是C中的结构体在堆中申请的一块内存(以CPython为例),每一个对象都有ID,可以通过ID(Object)获得。对象的范围包括内建类型的对象(如int类型的对象123,str的对象"test",list的对象[],生成器对象等等)、用户自建类型的对象、函数(lambda函数,生成器函数)、类型、Ture、False(bool类型的对象)、None(NoneType的对象)。
1 print id(123)2 print id("test")3 printid([])4 print id(xrange(1, 3))5 print id(lambdav: v)6 printid(int)7 printid(True)8 printid(None)9
10 print type(123)11 print type("test")12 printtype([])13 print type(xrange(1, 3))14 print type(lambdav: v)15 printtype(int)16 printtype(True)17 print type(None)
1 19257680
2 19062656
3 27888896
4 19590176
5 27863344
6 505361888
7 505379788
8 505354444
9
10
11
12
13
14
15
16
猜想int类型、True和None都是在高地址中,而动态生成的都是位于低地址中。
二,Python的引用计数:
所有对象都采用引用计数,给对象分配新名词或者将其放入容器中,这个对象的引用计数都会增加。当离开作用域或者被重新赋值的时候,这个对象的引用计数就会减少。当减少为0,垃圾收集器会将其销毁。
Python中的对象分为immutable和mutabel,作为immutable的int、char和tuple,相同的值在内存中只会生成一次,每次将其赋值到变量中,便会增加一个引用计数。而作为mutable的list、dict、xrange(生成器)和lambda(函数),每次生成都会在内存中生成一个新的对象。
另外:传参的时候,若参数为mutable,则传的是引用,若参数为immutable,则传的是值。
1 a = 123 #创建一个值为123的对象
2 b = 123 #增加123的引用计数
3 a = 111 #创建一个值为111的对象,减少123的引用计数
4 b = a #增加111的引用计数
5
6 c = [] #创建一个空队列
7 d = [] #创建一个新的空队列
8 c = [] #再创建一个新的空队列,减少原队列的引用计数
9 c = d #增加d队列的引用计数,减少c队列的引用计数
10 c.append(1) #创建一个值为1的对象,不改变原队列的引用计数
三,Shallow copy和Deep copy的区别
Python document中是这么说的:
A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.
这其中的区别就是浅复制会简单的复制引用,不管他是mutable还是immutable。而深复制则会递归地复制immutable对象引用,对于mutable,则会新建一个对象。
1 importcopy2 a = [1, 2]3 b = [a, 3]4 c = copy.copy(b) #c = [[1, 2], 3]
5 d = copy.deepcopy(b) #d = [[1, 2], 3]
6 a.append(3) #c = [[1, 2, 3], 3]
7 #d = [[1, 2], 3]
四,如何控制Shallow copy和Deep copy?
在deepcopy时候,会遇到问题,比如有对象中有一个指向用户信息的列表,用户希望在复制的时候直接引用原列表。这个时候可以使用定制功能。
可以在类型中定义__copy__和__deepcopy__实现shallow copy和deep copy,当用户下次调用copy.copy和copy.deepcopy时,便会调用__copy__和__deepcopy__。
1 importcopy2 classExample(dict):3 def __init__(self, needcopy={}, userinfo={}):4 super(Example, self).__init__()5 self.need =needcopy6 self.user =userinfo7
8 def __deepcopy__(self, memo):9 if memo isNone:10 memo ={}11 result = self.__class__()12 memo[id(self)] =result13 for key inself.need.keys():14 result.need =copy.deepcopy(self.need)15 result.user =self.user16 returnresult17
18 needcopy = {"price": 100}19 userinfo = {"user": "vincent"}20 a =Example(needcopy, userinfo)21 b =copy.deepcopy(a)22 needcopy["title"] = "no"
23 userinfo["passwd"] = "none"
24 print "need:", a.need, "; user:", a.user25 print "need:", b.need, "; user:", b.user
1 need: {'price': 100, 'title': 'no'} ; user: {'passwd': 'none', 'user': 'vincent'}2 need: {'price': 100} ; user: {'passwd': 'none', 'user': 'vincent'}
Output
pythoncopy和deepcopy_Python中的Copy和Deepcopy相关推荐
- copy模块中的copy与deepcopy的区别
前言 每空闲下来,就觉得以前写的博客很low........也许现在也很low~~~~好吧就当升级版的low吧~~~~ 如果要了解copy与deepcopy的区别,就需要了解Python的存储机制:P ...
- python中的copy()与deepcopy()
1.对于非嵌套的列表,对列表进行copy()与deepcopy()操作,看不出差别 a = [1,2,3] b = a.copy() #浅拷贝 b = a[:] #浅拷贝 b = a.deepcop ...
- python中字典dict的中的copy和deepcopy
https://www.cnblogs.com/gusseMe/p/12924656.html
- python copy deepcopy_python copy与deepcopy (拷贝与深拷贝)
copy与deepcopy python 中的copy与deepcopy是内存数据的操作,但是两个函数有一定的区别. 1.copy importcopy list= [1, [4, 5, 6], 2, ...
- python copy与deepcopy (拷贝与深拷贝)
copy与deepcopy python 中的copy与deepcopy是内存数据的操作,但是两个函数有一定的区别. 1.copy import copy list = [1, [4, 5, 6], ...
- python中copy和deepcopy的区别_python里shadowcopy和deepcopy的区别
python中,经常会需要拷贝特定对象,在此可能就会遇到各种bug,原因就是明白这三种操作的区别,赋值,浅拷贝,深拷贝. 赋值(=),浅拷贝(copy)和深拷贝(deepcopy)比较容易区别开的是赋 ...
- Python中copy和deepcopy中的区别
最近在学习 Python编程,遇到copy和deepcopy感到很困惑,现在针对这两个方法进行区分,一种是浅复制(copy),一种是深度复制(deepcopy). 首先说一下deepcopy,所谓的深 ...
- python中copy和deepcopy详细区别
python中copy和deepcopy 在 python 中,标识一个对象唯一身份的是:对象的id(内存地址),对象类型,对象值. deepcopy是真正意义上的复制,深拷贝,被复制对象完全复制一遍 ...
- Python中copy()和deepcopy()的区别
同样是copy,二者有什么不同呢今天我们就一探究竟!!! 关于copy()和deepcopy()的第一篇博客 初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从 ...
最新文章
- 孪生素数 java代码_科学网—孪生素数猜想——利用 Java + 正则表达式 输出孪生素数对 - 马廷灿的博文...
- 二分查找之搜索插入位置
- 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数...
- 深度学习在美团的应用
- centos vsftp mysql_CentOS6.4 实现基于mysql的vsftpd
- C# ---- GC中代的递增规律
- UI设计使用模板素材|登录界面设计
- ASP.NET MVC 5 SmartCode Scaffolding for Visual Studio.Net
- 机器学习入门系列:关于机器学习算法你需要了解的东西、如何开发机器学习模型?...
- DFA敏感词过滤算法详解
- 嵩天python测验_考试 嵩天老师 :测验3: Python语法程序与设计(第3周)
- 基于MATLAB/Simulink的电力电子电路仿真技术——直流降压(Buck)变换器及Powergui的使用
- 程序员业余时间修炼指南
- 假币问题详解(枚举的经典例题)
- java毕业设计汽车售后服务管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
- 外汇天眼:英国央行是如何向市场抛出救生索的
- QT案例 使用QGraphicsView和命令模式设计完成流程图功能软件,参考QT官方流程图案例【diagramscene】
- 给计算机老师发一封信,写给计算机老师的感谢信.doc
- java:JAVA获取日期时间加一年或加一月或加一天
- 中子测井之热中子、超热中子和补偿中子测井基本原理