python学习之深浅拷贝
4.2 深浅拷贝
4.2.1 认识
首先应该知道python中变量在内存中是怎么存放的!
在python中,变量与变量的值占用不同的内存。变量占用的内存,并非直接存储数值,而存储的是值在内存中的地址。
各种变量在内存中的存储,如下图:

下面进行代码测试:
ls = ['德玛','皇子','赵信']
ls1 = ls           #ls1 = ls 实际上是ls1指向了ls指向的地址块,两者指向的是同一块地址区域,不是拷贝
print(ls1)         #输出ls = ['德玛','皇子','赵信']
ls.append('女警')   #对ls进行元素操作时,也是对ls1造成影响
print(ls1)         #输出['德玛', '皇子', '赵信', '女警']
ls2 = ls[:]        #利用切片,在内存中新建了一个列表,ls2指向这个新的列表,浅拷贝
print(ls2)         #输出ls = ['德玛','皇子','赵信']
ls.append('剑豪')   #对ls的元素进行任何操作,都不会影响ls2的内容
print(ls2)          #输出ls = ['德玛','皇子','赵信']
注意: a = 1 b= a 这不是拷贝,赋值是多个变量指向同一个内存地址,内存的任一元素改变,所有变量都受影响;
 a = [1,2,3,4] b=a[:] 这是切片,切片是得到了一个新的列表,属于浅拷贝。
4.2.2 浅拷贝.copy
对只有一层元素关系的列表进行测试:
ls = ['德玛','皇子','赵信']
ls1 = ls.copy()
print(id(ls),id(ls1))    #输出  2551633171528 2551633985416,可见二者指向的内存地址不同
ls.append('剑豪')
ls1.append('女警')
print(ls)            #输出 ['德玛', '皇子', '赵信', '剑豪'],对ls的append操作没有影响ls1
print(ls1)			#输出 ['德玛', '皇子', '赵信', '女警'],对ls1的append操作没有影响ls
ls.pop(ls[0])
从以上结果可得:在copy完之后,新的列表指向新的内存地址,分别对列表的最后一位进行appen操作,结果互不影响。
对具有二层的元素的列表进行测试:
##对ls的第二个元素进行append操作
ls = ['德玛',['费欧娜','戴安娜'],'赵信']
ls1 = ls.copy()
print(ls1)				    #输出['德玛', ['费欧娜', '戴安娜'], '赵信']
ls[1].append('莫甘娜')       #copy完成后对ls的第二个元素进行append操作
print(ls1)           #输出'德玛', ['费欧娜', '戴安娜', '莫甘娜'], '赵信'],ls1发生了改变
print(id(ls[1]),id(ls1[1]))  #查看两者的ID,2202073060424 2202073060424
##对ls1的第二个元素进行操作
ls = ['德玛',['费欧娜','戴安娜'],'赵信']
ls1 = ls.copy()
print(ls)			    #输出['德玛', ['费欧娜', '戴安娜'], '赵信']
ls1[1].append('莫甘娜')	#copy完成后对ls1的第二个元素进行append操作
print(ls)			#输出'德玛', ['费欧娜', '戴安娜', '莫甘娜'], '赵信'],ls发生了改变
print(id(ls[1]),id(ls1[1]))  #输出 2303581443144 2303581443144
从上边输出的结果来看,copy完成之后,分别对ls和ls1的中间元素进行append操作,对方的元素也会发生相应的改变。
结论:浅拷⻉, 只会拷⻉第⼀层内容,只拷贝第二层关系的内存地址,而第⼆层的内容不会拷贝,所以被称为浅拷贝。
4.2.3 深拷贝.deepcopy()
深拷贝使用之前一定要先加载copy模块,import copy
语法为:
import copy
new_ls = copy.deepcopy(ls)
#对ls进行二层操作
import copy
ls = ['德玛',['费欧娜','戴安娜'],'赵信']
ls1 = copy.deepcopy(ls)
ls[1].append('莫甘娜')
print(ls)                 #输出['德玛', ['费欧娜', '戴安娜', '莫甘娜'], '赵信']
print(ls1)				 #输出['德玛', ['费欧娜', '戴安娜'], '赵信']
#对ls1进行二层操作
import copy
ls = ['德玛',['费欧娜','戴安娜'],'赵信']
ls1 = copy.deepcopy(ls)
ls1[1].append('莫甘娜')
print(ls)				#输出['德玛', ['费欧娜', '戴安娜'], '赵信']
print(ls1)				#输出['德玛', ['费欧娜', '戴安娜', '莫甘娜'], '赵信']
由以上结果可得:深拷贝是完完全全的复制,是创建一个完完全全的新的对象,新旧对象之间不会相互影响。不可变数据类型新旧列表指向同一个空间,可变类型新列表创建了新的空间
【注意:】
a = [1, 2]
a[1] = a   #对a列表的第二个元素进行修改成自己
print(a[1])  #输出为[1, [...]]
print(id(a),id(a[1]))  #输出内存地址1191853053000 1191853053000  a与a[1]的内存地址一样
print(type(a[1]))  ##输出<class 'list'>
分析: a[1] 原来是int类型,在对a[1]进行修改操作时,会先把原来的指向剪断,因为赋值a,指向了自己,此时出现了数据上的死循环
python学习之深浅拷贝的更多相关文章
- Python学习(006)-深浅拷贝及集合
		
深浅拷贝 import copy husband=['xiaoxin',123,[200000,100000]] wife=husband.copy() #浅拷贝 wife[0]='xiaohong ...
 - Python学习 :深浅拷贝
		
深浅拷贝 一.浅拷贝 只拷贝第一层数据(不可变的数据类型),并创建新的内存空间进行储蓄,例如:字符串.整型.布尔 除了字符串以及整型,复杂的数据类型都使用一个共享的内存空间,例如:列表 列表使用的是同 ...
 - Python学习-列表深浅拷贝
		
一.先看一个简单的赋值语句 lst1 = ['France', 'Belgium', 'England'] lst2 = lst1 # lst1.append('Uruguay') lst2.appe ...
 - day8 python学习 集合 深浅拷贝
		
1.内存地址: 字符串在20位以内,没有空格,没有特殊字符的情况下,同样的字符串内存地址是一样的 2.元组中:在只有一个值的时在后边加逗号和没有逗号的区别 t1=(1) 不加逗号这个值是什么类型就打印 ...
 - python学习day7 深浅拷贝&文件操作
		
4-4 day07 深浅拷贝&文件操作 .get()用法 返回指定键的值,如果值不在字典中返回默认值. info={'k1':'v1,'K2':'v2'}mes = info.get('k1' ...
 - 第五篇python进阶之深浅拷贝
		
目录 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 二.拷贝(只针对可变数据类型) 三.浅拷贝 四.深拷贝 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 id不 ...
 - 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝
		
Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...
 - Python 中的深浅拷贝
		
Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...
 - python——赋值与深浅拷贝
		
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
 
随机推荐
- spring 视图解析 ——InternalResourceViewResolver
			
原文:https://www.cnblogs.com/lyj-gyq/p/8963885.html Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现 首先将会介绍 InternalR ...
 - js  点击不同li  切换颜色
			
html <div> <li " onclick='addColor(this.id)'> 会议简介 </li> <li " onclic ...
 - 程序流程图、N-S图、PAD图
			
在需求分阶段经常使用3种方法去剖析我们所面对的业务. 程序流程图 任何复杂的程序图都应由5种基本控制结构组成或嵌套而成. 盒图(N-S图) Nassi和Scheiderman提出了一种符合结构化程序设 ...
 - 问题-CHM文件不显示
			
原问题:http://bbs.csdn.net/topics/370230310 问题描述: http://download.csdn.net/download/wybneu/3582721 我从这个 ...
 - Ubuntu 安装matlab2013b
			
下载软件包: 链接:http://pan.baidu.com/s/1bHoFHc 密码:lugc 还要注意软件的解压的问题: 链接:http://pan.baidu.com/s/1geBEQyf 密码 ...
 - vue 里面异步加载高德地图
			
前言 关于Vue 里面使用异步加载高德地图 项目中其实只有几处需要用到地图,不需要全局引入 在index文件中引入js会明显拖慢首屏加载速度,虽然可以使用异步加载script的方式解决,但是始终觉得不 ...
 - mysql之单表条件查询
			
create table staff_info( id int primary key auto_increment, name varchar(32) not null, age int(3) un ...
 - Python 操作 MySQL 数据库Ⅱ
			
数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB. 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST_NAME, LAST_N ...
 - 在CentOS/Windows下配置Nginx(以及踩坑)
			
在CentOS/Windows下配置Nginx(以及踩坑) 1. 序言 因为这类文章网上比较多,实际操作起来也大同小异,所以我并不会着重于详细配置方面,而是将我配置时踩的坑写出来. 2. CentOS ...
 - mongodb  .net 版本
			
1.现下载驱动 再 引用dll 2.https://www.cnblogs.com/zxtceq/p/7692200.html mongodb .net 版本 https://www.cnbl ...