(五)聊一聊深Copy与浅Copy
一、关于浅copy与深copy
首先说明一下:
在python中,赋值其实就是对象的引用,变量就是对象的一个标签,如果把内存对象比喻成一个个房间,那么变量就是门牌号。
深copy与浅copy只是针对可变类型而言,对于不可变类型,无论深浅,值相等,内存地址一样,一旦值发生变化,相当于再创建一个对象。
浅copy有3种方法:
a=[1,2,3,["a","b"],22]
a1=a[:] 切片操作
a2=list(a) 工厂函数
a3=copy.copy(a) 或 a3=a.copy() 用copy方法
深copy:
deepcopy()方法
具体见代码:
import copy
a=[1,2,["a","b","c"],22,34]
b=a #相当于一个内存地址赋予两个标签a和b而已,其实a就是b,b就是a
print(id(a),id(b),a is b)
#id:2828862838856 2828862838856 返回True
b1=a[:]#切片拷贝,值相等,id不同,两个内存对象
print(id(b1),id(a),a is b1,id(b1[0]),id(a[0]),sep="\n")
#id:1811258826056 1811258824776 返回False
#子对象地址一样:1990094304 1990094304
b2=list(a) #工厂函数
print(id(b2),id(a))
b3=copy.copy(a)
b4=a.copy()
print(id(b3))
a[0]=99
print(id(a[0]),id(b1[0]))
a[2][0]="a1" #只要根中某一层子元素改变,浅copy的对象就会就改变
print(a,b1,b2,b3,sep="\n")
a[2][0]="d"
d=copy.deepcopy(a)
print(d,a) #完全独立于a
#[99, 2, ['d', 'b', 'c'], 22, 34] [99, 2, ['d', 'b', 'c'], 22, 34]
总结:
1、赋值:简单地拷贝对象的引用,两个对象的id相同。
2、浅拷贝:创建一个新的组合对象,这个新对象与原对象共享内存中的子对象,还存在关联。
3、深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联。虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。
浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。
作用:深拷贝相当于备份一份
(五)聊一聊深Copy与浅Copy的更多相关文章
- Day 7 深copy和浅Copy
dict.fromkeys的用法 1 2 3 4 5 6 7 8 9 10 11 #dict.fromkeys的用法 #例子1 dic = dict.fromkeys([1,2,3],[]) prin ...
- Python的深copy和浅copy
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 浅copy: a = [1, 2, ...
- 列表的使用2,深COPY和浅COPY,循环列表,步长切片
name2=names.copy() 下面我看几种奇怪的现象: 首先把源列表copy以后,把源列表第2个数值修改.那么没毛病. 如果源列表里,还包含了一个子列表:这也没毛病 如果我们这个时候修改子列表 ...
- 深copy和浅copy
浅copy:其实就是将容器中的内存地址存放进另一个容器中,所以两个容器本身的内存地址不相同,但容器里面的内存地址相同 代码如下: 深copy:就是从里到外完完全全复制了所有值,存进另外的内存空间,并赋 ...
- python中深copy,浅copy与赋值语句的区别
以下详细讲解:python深复制,浅复制与赋值语句的区别 1. '='赋值语句,常规复制只是将另一个变量名关联到了列表,并不进行副本复制,实例如下: var1=[12,35,67,91,101]var ...
- C/C++深度copy和浅copy
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string. ...
- 深浅copy和浅copy
深浅copy 1,先看赋值运算. l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['barry', ...
- python中深copy,浅copy
版权声明:本文为博主原创文章,未经博主允许不得转载. >>> mylist1 = [1, 2, 3, 4] >>> myl = mylist1 >>&g ...
- PHP的深copy和浅copy
1.对象复制的由来 为什么对象会有“复制”这个概念,这与PHP5中对象的传值方式是密切相关的,让我们看看下面这段简单的代码 /** * 电视机类 */ class Television { /** * ...
随机推荐
- JQ表格隔行换色
<style type="text/css"> html, body { margin: 0; padding: 0; font-size: 15px; font-fa ...
- 为什么作为下游的WSUS更新服务器总有一直处于下载状态的文件
/* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-ts ...
- [题解]SP703 SERVICE - Mobile Service_Done
设计状态F[i][j][k]代表完成任务i后,有一个员工在地点P[i],其他两人分别在j和k两地.所需要的最小代价. 转移的方式: 分别考虑派遣i,j,k三人前往下一个需求地点,并更新状态. #inc ...
- 三十九、vue中element最原始的分页(未封装的)
html<el-table ref="scoreUserTable" :data="scorePageUser.slice((currentPage1-1)*pag ...
- 石家庄地铁系统开发(java web版)(一)
今天所完成的任务: 在Mysql数据库中创建了sjzsubstop表和sjzsubway表 sjzsubstop表用于录入所有站点名称和与之对应的stopid(作为主码) sjzsubway表用于录入 ...
- php框架之phalcon
1.开发助手 1) 下载 git clone https://github.com/phalcon/cphalcon.git git clone https://github.com/phalcon/ ...
- JS 获取某个容器控件中id包含制定字符串的控件id列表
//获取某容器控件中id包含某字符串的控件id列表 //参数:容器控件.要查找的控件的id关键字 function GetIdListBySubKey(container,subIdKey) { va ...
- windows系统下的特殊目录导致的FileNotFoundException
环境:下面只有JDK(内含jre),没有外在的jre 读取的两个文件都是存在的,只是文件名不同 运行结果1 运行结果2 切换JDK 运行结果3: 运行结果4: 请留意:C:\windows\syste ...
- RedisCache 缓存
/// <summary> /// 这是包装过公用的,用于本站而已. /// </summary> /// <author>rixiao</author> ...
- win10双系统安装卸载ubuntu
安装 1. 官网下载需要安装的Ubuntu版本 2. 格式化U盘,用UltraISO软件将Ubuntu写入U盘 3. 设置电脑U盘启动,重启电脑安装,注意安装时关闭在线下载,否则会安装很久 4. 安装 ...