首先我们来讲讲我们python中的可变对象和不可变对象:

可变对象:该对象指向内存中的值是可以改变的。实际上是其所指的值直接发生改变,而不是发生复制,或者开辟一个新的地址空间。例如:列表list,字典dict,集合set。 
不可变对象:该对象所指向的内存中的值是不能被改变的。当改变一个变量时,由于其所指的值不能被改变,相当于把原来的值复制一份到新开辟的地址,再进行改变,并将变量指向这个新的地址空间。例如:数值类型(int、float)、字符串str、元组tuple。

python中对象的赋值实际上是对象的引用,例如:

a = [1,2,3]

实际上在电脑内部是生成一个地址将list[1,2,3]放在这个地址,在赋值给a时,就是讲a指向了这个地址。如果此时我们再执行 a = [4,5,6],并不是说在我们的内存中[1,2,3]就不存在了,这个列表是一直存在的,只是我们将变量a指向了一个新的列表的地址。

  • 下面我们讲讲浅拷贝(包含可变对象:此处可变为中间的list对象):
 
  1. >>> alist=[1,2,3,["a","b"]]
  2. >>> b = alist
  3. >>>print b
  4. [1,2,3,['a','b']]
  5. >>> alist.append(5)
  6. >>>print alist
  7. [1,2,3,['a','b'],5]
  8. >>>print b
  9. [1,2,3,['a','b'],5]

在这个程序块中,当我们执行alist.append(5)实际上改变的是alist这个变量指向的list,由于我们的变量b也是指向这个list,所以变量b的值也跟着改变。

  • copy.copy()浅拷贝 
    这个copy.copy没有拷贝可变对象,即当可变对象发生变化时,所有的变量都会跟着发生变化。 
    例如:
 
  1. >>>import copy
  2. >>> c=copy.copy(alist)
  3. >>>print alist;print c
  4. [1,2,3,['a','b']]
  5. [1,2,3,['a','b']]
  6. >>> alist.append(5)
  7. >>>print alist;print c
  8. [1,2,3,['a','b'],5]
  9. [1,2,3,['a','b']]
  10. >>> alist[3]
  11. ['a','b']#这个对象是可变对象
  12. >>> alist[3].append('cccc')
  13. >>>print alist;print c
  14. [1,2,3,['a','b','cccc'],5]
  15. [1,2,3,['a','b','cccc']]
  • copy.deepcopy拷贝了包含可变对象在内的所有对象
 
  1. >>>import copy
  2. >>> d=copy.deepcopy(alist)#此时d和alist是两个完全独立的对象
  3. >>>print alist;print d
  4. [1,2,3,['a','b']]
  5. [1,2,3,['a','b']]始终没有改变
  6. >>> alist.append(5)
  7. >>>print alist;print d
  8. [1,2,3,['a','b'],5]
  9. [1,2,3,['a','b']]始终没有改变
  10. >>> alist[3]
  11. ['a','b']
  12. >>> alist[3].append("ccccc")
  13. >>>print alist;print d
  14. [1,2,3,['a','b','ccccc'],5]
  15. [1,2,3,['a','b']]始终没有改变

python学习笔记--深拷贝与浅拷贝的区别的更多相关文章

  1. Python赋值语句与深拷贝、浅拷贝的区别

    参考:http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-d ...

  2. python学习笔记七:浅拷贝深拷贝

    原理 浅拷贝 import copy b = copy.copy(a) demo: >>> a=[1,['a']] >>> b=a >>> c=c ...

  3. python赋值,深拷贝和浅拷贝的区别

    1.赋值 list1=[[1,2],'fei',66] list2=list1 list1 [[1, 2], 'fei', 66] list2 [[1, 2], 'fei', 66] list2.ap ...

  4. ES6-11学习笔记--深拷贝与浅拷贝

    Object.assign,只是进行了浅拷贝,并没有进行深拷贝. 而且会在复杂结构当中会丢失属性,如下代码: let target = { a: { b: { c: 3 }, e: 4, f: 5, ...

  5. Python 深拷贝和浅拷贝的区别

    python的复制,深拷贝和浅拷贝的区别    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用  ...

  6. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

  7. Python学习笔记(七)

    Python学习笔记(七): 深浅拷贝 Set-集合 函数 1. 深浅拷贝 1. 浅拷贝-多层嵌套只拷贝第一层 a = [[1,2],3,4] b = a.copy() print(b) # 结果:[ ...

  8. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  9. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

随机推荐

  1. Scroller的应用--滑屏实现

    1.Scroller源代码分析 以下是对Scroller源代码的分析,并附有源代码.例如以下: package android.widget; import android.content.Conte ...

  2. [NHibernate] 入门实例 NHibernate 3.3 GA + VS2010 +MySQL

    题外话: 中国的技术论坛要赶上stackoverflow的水平.至少还需35年.中国程序猿笔者的特点是:太浮躁,太easy下总结.太自得其乐,虽说写的是为了让别人更好的看.却也演变成了一种" ...

  3. codeforces 939E Maximize! 双指针(two pointers)

    E. Maximize! time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...

  4. RDA 搜台

    转载马斯特·李 流程: 将channel的读写回调在AL_FW_Init中注册 初始化datasaving部件,注册datasaving的回调,并建立DATASAVING_NvmStore_Threa ...

  5. html5中不再支持的元素

    html5中不再支持的元素:1.acronym(建议abbr) : 定义首字母缩写2.applet(建议object): 定义 applet3.basefont(使用css控制)4.big(使用css ...

  6. 【XSY3209】RGB Sequence

    题目 传送门 解法 用\(f_{i, j, k}\)表示有\(i\)个红石块, \(j\)个绿宝石块, \(k\)个钻石块 可以转移到\(f_{p+1, j, k}\). \(f_{i, p+1,k ...

  7. [Swift通天遁地]九、拔剑吧-(8)创建气泡式页面切换效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. RHEL6.5安装成功ORACLE11GR2之后,编写PROC程序出错解决方法

    1.  proc: error while loading shared libraries: libclntsh.so.11.1: cannot open shared object file: N ...

  9. ashx 文件的使用

    它就类似.aspx文件,用于处理传入到服务器的HTTP请求,但它不会像.aspx文件那样要返回处理结果和大量HTML,它可以返回简单的字符串.图片等. 百度百科定义链接:http://baike.ba ...

  10. 涨知识-VI 基于TCP/UDP的应用层协议

    基于TCP/UDP的应用层协议: 基于TCP: Telnet(Teletype over the Network, 网络电传),通过一个终端(terminal)登陆到网络 FTP(File Trans ...