一,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相关推荐

  1. copy模块中的copy与deepcopy的区别

    前言 每空闲下来,就觉得以前写的博客很low........也许现在也很low~~~~好吧就当升级版的low吧~~~~ 如果要了解copy与deepcopy的区别,就需要了解Python的存储机制:P ...

  2. python中的copy()与deepcopy()

    1.对于非嵌套的列表,对列表进行copy()与deepcopy()操作,看不出差别 a = [1,2,3] b = a.copy()  #浅拷贝 b = a[:] #浅拷贝 b = a.deepcop ...

  3. python中字典dict的中的copy和deepcopy

    https://www.cnblogs.com/gusseMe/p/12924656.html

  4. python copy deepcopy_python copy与deepcopy (拷贝与深拷贝)

    copy与deepcopy python 中的copy与deepcopy是内存数据的操作,但是两个函数有一定的区别. 1.copy importcopy list= [1, [4, 5, 6], 2, ...

  5. python copy与deepcopy (拷贝与深拷贝)

    copy与deepcopy python 中的copy与deepcopy是内存数据的操作,但是两个函数有一定的区别. 1.copy import copy list = [1, [4, 5, 6], ...

  6. python中copy和deepcopy的区别_python里shadowcopy和deepcopy的区别

    python中,经常会需要拷贝特定对象,在此可能就会遇到各种bug,原因就是明白这三种操作的区别,赋值,浅拷贝,深拷贝. 赋值(=),浅拷贝(copy)和深拷贝(deepcopy)比较容易区别开的是赋 ...

  7. Python中copy和deepcopy中的区别

    最近在学习 Python编程,遇到copy和deepcopy感到很困惑,现在针对这两个方法进行区分,一种是浅复制(copy),一种是深度复制(deepcopy). 首先说一下deepcopy,所谓的深 ...

  8. python中copy和deepcopy详细区别

    python中copy和deepcopy 在 python 中,标识一个对象唯一身份的是:对象的id(内存地址),对象类型,对象值. deepcopy是真正意义上的复制,深拷贝,被复制对象完全复制一遍 ...

  9. Python中copy()和deepcopy()的区别

    同样是copy,二者有什么不同呢今天我们就一探究竟!!! 关于copy()和deepcopy()的第一篇博客 初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从 ...

最新文章

  1. 孪生素数 java代码_科学网—孪生素数猜想——利用 Java + 正则表达式 输出孪生素数对 - 马廷灿的博文...
  2. 二分查找之搜索插入位置
  3. 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数...
  4. 深度学习在美团的应用
  5. centos vsftp mysql_CentOS6.4 实现基于mysql的vsftpd
  6. C# ---- GC中代的递增规律
  7. UI设计使用模板素材|登录界面设计
  8. ASP.NET MVC 5 SmartCode Scaffolding for Visual Studio.Net
  9. 机器学习入门系列:关于机器学习算法你需要了解的东西、如何开发机器学习模型?...
  10. DFA敏感词过滤算法详解
  11. 嵩天python测验_考试 嵩天老师 :测验3: Python语法程序与设计(第3周)
  12. 基于MATLAB/Simulink的电力电子电路仿真技术——直流降压(Buck)变换器及Powergui的使用
  13. 程序员业余时间修炼指南
  14. 假币问题详解(枚举的经典例题)
  15. java毕业设计汽车售后服务管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  16. 外汇天眼:英国央行是如何向市场抛出救生索的
  17. QT案例 使用QGraphicsView和命令模式设计完成流程图功能软件,参考QT官方流程图案例【diagramscene】
  18. 给计算机老师发一封信,写给计算机老师的感谢信.doc
  19. java:JAVA获取日期时间加一年或加一月或加一天
  20. 中子测井之热中子、超热中子和补偿中子测井基本原理

热门文章

  1. 【小猫爪】AUTOSAR学习笔记14-EcuM模块
  2. Vj程序设计作业H6
  3. 神之惩戒—-MMORPG的困局
  4. 河内之塔【C++版】
  5. 一句话总结—打发无聊的时间
  6. 性能服务器suv,史上最全良心国产SUV性能对比
  7. MongoDB知识概括
  8. java中怎么让一个数倒转_java 输入一个数字,反转输出这个数字的值(实现方法)
  9. 2048游戏之——C++与控制台
  10. 访黏度计算公式_FactSage粘度模块Viscosity的基本使用方法(一)