Python中的浅复制、深复制
参考
- https://docs.python.org/3/library/copy.html?highlight=copy copy#copy.copy
- https://en.wikipedia.org/wiki/Object_copying#Shallow_copy
Fluent Python第四部分第8章
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.
Note:
- 直接赋值:其实就是对象的引用(别名)。
- 浅复制(shallow copy):copy模块的copy方法,复制父对象,不会复制对象的内部的子对象。
- 深复制(deepcopy): copy 模块的 deepcopy 方法,完全复制了父对象及其子对象。
注意,浅复制和深复制都创建新的对象,所以id()返回的值不同。浅复制的元素使用原始元素的引用(地址),而深复制的元素重拥有新的地址(即深复制copy everything).
深复制符合我们的认知,复制返回的对象就是一个完全独立的对象。
例子1. 浅复制
import copy
origin_dict = {
1 : [1,2,3]
}
#浅复制可以引入copy模块或者compound objects自带的copy()
#shcp_didct = origin_dict.copy()
shcp_dict = copy.copy(origin_dict)
print(id(origin_dict))
print(id(shcp_dict))
print(origin_dict[1].append(555))
print(origin_dict)
print(shcp_dict)

例子2. 深复制
#深复制必须引入copy模块
import copy
origin_dict = {
1 : [1,2,3]
}
shcp_dict = copy.deepcopy(origin_dict)
print(id(origin_dict))
print(id(shcp_dict))
print(origin_dict[1].append(555))
print(origin_dict)
print(shcp_dict)

Python中的浅复制、深复制的更多相关文章
- [Python]Python中的浅复制与深复制
看python的文档,发现list有copy方法,描述说效果同a[:]. 感觉有点惊讶,之前一直以为a[:]执行的是深复制. test了一下,发现确实如果a中存在可变对象,如list/set/dict ...
- Python学习日记之字典深复制与浅复制
Python中通过copy模块有两种复制(深复制与浅复制) copy 浅复制 复制时只会复制父对象,而不会复制对象的内部的子对象. deepcopy 深复制 复制对象及其子对象 因此,复制后对原dic ...
- python学习(7)关于列表操作相关命令以及浅复制深复制
在python中,[]表示的是列表.列表有各种操作命令. 1.append()方法,添加一个元素到列表尾部. 注意append()方法与extend()方法有区别:list.append(object ...
- Python中对象的引用与复制
在python进行像b = a这样的赋值时,只会创建一个对a的新引用,使a的引用计数加1,而不会创建新的对象: >>> a = 'xyz' >>> import s ...
- Javascript中的一种深复制实现
在javascript中,所有的object变量之间的赋值都是传地址的,可能有同学会问哪些是object对象.举例子来说明可能会比较好: typeof(true) //"boolean&qu ...
- java 浅复制 深复制
1.浅复制 只是复制引用,对引用的操作会影响之前复制的对象. 2.深复制 复制一个完全独立的对象,复制对象与被复制对象相互之间不影响. 只是概念性东西....
- python中的赋值操作和复制操作
之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...
- Python赋值、浅复制和深复制
Python赋值.浅复制和深复制 首先我们需要知道赋值和浅复制的区别: 赋值和浅复制的区别 赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据.即赋值后,两 ...
- java 及 Jquery中的深复制 浅复制
发现问题:最近 遇到由于复制对象之后,改变复制后的新变量,原先被复制的对象居然会跟着变. EX:java中: //holidayConfig.getEnd_time()会随着sTime的改变而改变 s ...
随机推荐
- JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
在WEB页面中,我们实现页面跳转的方法通常是用LINK,BUTTON LINK ,IMG LINK等等,由用户点击某处,然后直接由浏览器帮我们跳转. 但有时候,需要当某事件触发时,我们先做一些操作,然 ...
- CSS遮罩层简易写法
现在很多站点弹出框,都需要一个遮罩层.写法很多,以下是我比较喜欢的一种: .box{ position:absolute; top:0; bottom:0; left:0; right:0; ba ...
- TCP/IP协议-为什么说TCP是可靠连接
我们平常经常说UDP是不可靠连接,TCP是可靠连接,然而TCP为什么是可靠的呢 1. TCP和UDP的优缺点TCP 缺点: [1] 三次握手四次挥手,传输更多包,浪费一些带宽[2] 为了进行可靠通信, ...
- SQL注入 盲注
来源:http://www.cnblogs.com/cheatlove/articles/384233.html SQL注入攻击: (1) 脚本注入式的攻击(2) 恶意用户输入用来影响被执行的SQL脚 ...
- Flink架构(五)- 检查点,保存点,与状态恢复
检查点,保存点,与状态恢复 Flink是一个分布式数据处理系统,这种场景下,它需要处理各种异常,例如进程终止.机器故障.网络中断等.因为tasks在本地维护它们的state,Flink必须确保在出现故 ...
- WLC5520分布式端口(数据口)使用1G模块!
思科WLC5520有两个分布式端口. 在 10G 模式和 1G 模式之间切换•如果在端口 1 上未安装任何内容,则默认情况下主板配置为 10G 模式.因此,要切换到 1G 模式,则必须在端口 1上安 ...
- response下载csv文件内容乱码问题
response下载csv文件内容乱码问题 解决办法:在输出流语句第一行输出 out.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF}); Se ...
- webpack4.41.0配置二(加载器_url-loader/babel-loader/sass-loader)
loader是webpack用来预处理源文件的,比如typesrcipt形式的文件最终都得转成浏览器可以执行的js文件 (注:以下的配置代码不一定与下方一摸一样,具体与官网上https://webpa ...
- org.apache.httpcomponents.httpclient
apache org doc :http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e49 ...
- dw选择器
选择器并没有一个固定的定义,在某种程度上说,jQuery的选择器和样式表中的选择器十分相似.选择器具有如下特点:1.简化代码的编写2.隐式迭代3.无须判断对象是否存在jQuery 的选择器可谓之强大无 ...