“对一个对象进行浅拷贝其实是新创建了一个类型和原来对象一样,但是内容是原来对象元素的引用。换句话说,这个拷贝的对象本身是新的,但是它的内容不是”

上面这段话摘自《Python核心编程》,我个人觉得说得很好。如果你也能够看懂的话,那么恭喜你。

看一段代码:

>>>person = ['name', ['savings', 100.00]]
>>>hubby = person[:]
>>>wifey = list(person)
>>>[id(x) for x in person, hubby, wifey]
[5332344, 5338216, 5341912]

从输出结果可以看出,person,hubby和wifey是不同的对象,

>>>[id(x) for x in person]
[4734944, 5338256]
>>>[id(x) for x in hubby]
[4734944, 5338256]
>>>[id(x) for x in wifey]
[4734944, 5338256]

分别将输出person[0], person[1], hubby[0], hubby[1],  wifey[0], wifey[1]的id进行比对,结果发现:

id(person[0])==id(hubby[0])==id(wifey[0])

id(person[1])==id(hubby[1])==id(wifey[1])

大致画了一下内存图:

从图中可以很容易看出id(person)、id(hubby)、id(wifey)是不同的,而person[0]、hubby[0]、wifey[0]指向的是同一个对象"name",person[1]、hubby[1]、wifey[1]指向的是同一个列表['savings', 100.00],这就是所谓的浅拷贝。

看到这,想必大家都知道什么是深拷贝了,继续看代码:

>>>import copy
>>>person = ['name', ['savings', 100.00]]
>>>hubby = person
>>>hubby[0] = 'Joe'
>>>
>>>wifey = copy.deepcopy(person)
>>>wifey[0] = 'Jane'

结合代码看图:

从图中可以很容易得看出,wifey和hubby中的内容(即wifey[0]、wifey[1]和hubby[0]、hubby[1])是完全不同的;

可能有的人问:为什么hubby[1][0]与wifey[1][0]、hubby[1][1]与wifey[1][1]指向的仍然是同一个对象?

其实这个原因很简单,因为在定义peroson这个列表时,就在内存中创建了'savings'和100.00这两个对象,而后面的hubby和wifey也要用到这两个对象,所以就直接拿过来用,没有必要再浪费内存空间创建一个新的和原来一模一样的对象。

这就是深拷贝,可以看到,我们在程序中使用了一个copy模块的函数deepcopy(),用它来完成深拷贝;其次,copy模块还有一个函数copy(),用它可以完成浅拷贝。

注意:1、非容器类型(比如数字、字符串和其他“原子”类型的对象等)没有深拷贝一说;

2、如果元组变量只包含原子类型对象(不可变对象),对它的深拷贝将不会进行,得到的就是浅拷贝。

Python对象之深拷贝、浅拷贝相关推荐

  1. 对象克隆-深拷贝,浅拷贝,直接赋值

    1背景分析 在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值.浅拷贝.深拷贝 这三种方式,我们常用的对象的转化方式,使用的是spring的 BeanUtils.co ...

  2. python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解

    本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...

  3. python怎样给对象赋值_Python对象赋值、浅拷贝和深拷贝

    总结: 1.copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象 2.copy.deepcopy 深拷贝 拷贝对象及其子对象 1.对象赋值 will = ["Will&quo ...

  4. python类对象赋值_Python对象赋值、浅拷贝、深拷贝

    Python中,基本数据类型,理解为常见数据类型:布尔型.整型.浮点型.字符串.列表.元组.字典.集合,随语言不同而不同,但是根据在内存中存储方式的不同,区分开原子类型和容器类型. 对象赋值 对象的赋 ...

  5. Python天天美味(22) - 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  6. Python基础:对象的深拷贝和浅拷贝的区别

    Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...

  7. Python 中的对象赋值、浅拷贝和深拷贝

    一.对象赋值 首先,创建了一个名为 will 的变量,这个变量指向一个 list 对象,从第一张图中可以看到所有对象的地址(每次运行,结果可能不同) 然后,通过 will 变量对 wilber 变量进 ...

  8. python 实例对象 浅拷贝_Python对象中的浅拷贝和深拷贝

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python中的赋值语句不会创建对象的副本,而只是给对象绑定了新的名称.对于不可变对象,这通常没什么区别. ...

  9. Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...

最新文章

  1. PL/SQL学习笔记-常量变量及数据类型初步
  2. 求两个datetime之间相差的天数
  3. 7、ns-3建立拓扑
  4. 马鞍山红星中学2021年高考成绩查询,2021年马鞍山高考状元名单公布,马鞍山高考状元学校资料及最高分...
  5. WebFlux响应式编程基础之 2 函数式编程 工具jclasslib bytecode viewer
  6. hadoop: Operation category READ is not supported in state standby
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的药店门店管理系统
  8. SpringCloud工作笔记089---SpringBoot中Mybatis使用Condition_Criteria如何筛选日期类型数据
  9. 简书UI易用性缺陷:投稿按钮太小
  10. 51nod 1130 N的阶乘的长度 V2(斯特林近似)
  11. 致远getshell
  12. llvm+clang 添加 LTO(Link Time Optimization) 支持
  13. N-Queen(java实现)
  14. 境外上市,一个绝非遥不可及的梦想!
  15. 基于VGGFace2的人脸性别年龄检测系统(源码&教程)
  16. qq华夏服务器状态,最国产!QQ华夏199组服务器皆“国名”
  17. 24岁女孩与30多岁成熟有家男人
  18. 第4章 虚拟机性能监控与故障处理工具
  19. macOS Ventura 13.0 (22A380) Boot ISO 原版可引导镜像
  20. 活体检测 Single-Side Domain Generalization for Face Anti-Spoofing 论文学习记录

热门文章

  1. JMM学习之Java实现原子性操作
  2. python学习之路—自动生成唯一标识(md5加密方式)
  3. DRM系列(8)之prepare_signaling
  4. 3-多点温度采集模块设计--DS18B20驱动函数模块设计
  5. 可编程网元的前世今生
  6. 2016 PSUT Coding Marathon(gym100989)
  7. 高手应对冲突,无外乎这9条秘诀
  8. 计算机学院表白情书,大学生的别样表白情书 --计算机学院成功举办南华大学第一届代码情书大赛...
  9. 东南任务汇-创业者需要具备这十项能力
  10. Linux下使用docker安装部署Sonar Qube