Python对象之深拷贝、浅拷贝
“对一个对象进行浅拷贝其实是新创建了一个类型和原来对象一样,但是内容是原来对象元素的引用。换句话说,这个拷贝的对象本身是新的,但是它的内容不是”
上面这段话摘自《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背景分析 在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值.浅拷贝.深拷贝 这三种方式,我们常用的对象的转化方式,使用的是spring的 BeanUtils.co ...
- python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解
本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...
- python怎样给对象赋值_Python对象赋值、浅拷贝和深拷贝
总结: 1.copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象 2.copy.deepcopy 深拷贝 拷贝对象及其子对象 1.对象赋值 will = ["Will&quo ...
- python类对象赋值_Python对象赋值、浅拷贝、深拷贝
Python中,基本数据类型,理解为常见数据类型:布尔型.整型.浮点型.字符串.列表.元组.字典.集合,随语言不同而不同,但是根据在内存中存储方式的不同,区分开原子类型和容器类型. 对象赋值 对象的赋 ...
- Python天天美味(22) - 拷贝对象(深拷贝deepcopy与浅拷贝copy)
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...
- Python基础:对象的深拷贝和浅拷贝的区别
Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...
- Python 中的对象赋值、浅拷贝和深拷贝
一.对象赋值 首先,创建了一个名为 will 的变量,这个变量指向一个 list 对象,从第一张图中可以看到所有对象的地址(每次运行,结果可能不同) 然后,通过 will 变量对 wilber 变量进 ...
- python 实例对象 浅拷贝_Python对象中的浅拷贝和深拷贝
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python中的赋值语句不会创建对象的副本,而只是给对象绑定了新的名称.对于不可变对象,这通常没什么区别. ...
- Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...
最新文章
- PL/SQL学习笔记-常量变量及数据类型初步
- 求两个datetime之间相差的天数
- 7、ns-3建立拓扑
- 马鞍山红星中学2021年高考成绩查询,2021年马鞍山高考状元名单公布,马鞍山高考状元学校资料及最高分...
- WebFlux响应式编程基础之 2 函数式编程 工具jclasslib bytecode viewer
- hadoop: Operation category READ is not supported in state standby
- 基于JAVA+SpringMVC+Mybatis+MYSQL的药店门店管理系统
- SpringCloud工作笔记089---SpringBoot中Mybatis使用Condition_Criteria如何筛选日期类型数据
- 简书UI易用性缺陷:投稿按钮太小
- 51nod 1130 N的阶乘的长度 V2(斯特林近似)
- 致远getshell
- llvm+clang 添加 LTO(Link Time Optimization) 支持
- N-Queen(java实现)
- 境外上市,一个绝非遥不可及的梦想!
- 基于VGGFace2的人脸性别年龄检测系统(源码&教程)
- qq华夏服务器状态,最国产!QQ华夏199组服务器皆“国名”
- 24岁女孩与30多岁成熟有家男人
- 第4章 虚拟机性能监控与故障处理工具
- macOS Ventura 13.0 (22A380) Boot ISO 原版可引导镜像
- 活体检测 Single-Side Domain Generalization for Face Anti-Spoofing 论文学习记录
热门文章
- JMM学习之Java实现原子性操作
- python学习之路—自动生成唯一标识(md5加密方式)
- DRM系列(8)之prepare_signaling
- 3-多点温度采集模块设计--DS18B20驱动函数模块设计
- 可编程网元的前世今生
- 2016 PSUT Coding Marathon(gym100989)
- 高手应对冲突,无外乎这9条秘诀
- 计算机学院表白情书,大学生的别样表白情书 --计算机学院成功举办南华大学第一届代码情书大赛...
- 东南任务汇-创业者需要具备这十项能力
- Linux下使用docker安装部署Sonar Qube