Python中赋值,深拷贝和浅拷贝
1python变量
变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不是这个变量的值本身。
2赋值
python变量赋值实际上是对象的引用。
如:
list_a = [1,2,3,"hello",["python","C++"]]
list_b = list_a
此时,list_b和list_a是一样的,他们指向同一片内存,list_b不过是list_a的别名,是引用。
我们可以使用 list_b is list_a 来判断,返回true,表明他们地址相同,内容相同。也可使用id(x) for x in list_a, list_b 来查看两个list的地址。
赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了新对象的引用。也就是说,除了list_b这个名字以外,没有其它的内存开销。修改了list_a,就影响了list_b;同理,修改了list_b就影响了list_a。
3浅拷贝
浅拷贝会创建新对象,其内容是原对象的引用。
浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy函数
比如对上述list_a,
切片操作:list_b = list_a[:]
列表生成式: list_b = [each for each in list_a]
copy()方法:list_b=list_a.copy()
for循环:list_b=[] for i in range(len(list_a)): list_b.append(list_a[i])
工厂函数:list_b = list(list_a)
copy函数:list_b = copy.copy(list_a)
浅拷贝产生的list_b不再是list_a了,使用is可以发现他们不是同一个对象,使用id查看,发现它们也不指向同一片内存。但是当我们使用id(x) for x in list_a 和 id(x) for x in list_b 时,可以看到二者包含的元素的地址是相同的。
在这种情况下,list_a和list_b是不同的对象,修改list_b理论上不会影响list_a。比如list_b.append([4, 5])。
但是要注意,浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在list_a中有一个嵌套的list,如果我们修改了它,情况就不一样了。
list_a[4].append(“C”)。查看list_b,你将发现list_b也发生了变化。这是因为,**你修改了嵌套的list。修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地址并为发生变化,指向的都是同一个位置。
4深拷贝
深拷贝只有一种形式,copy模块中的deepcopy函数。
和浅拷贝对应深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因而,它的时间和空间开销要高。
同样对list_a,若使用list_b = copy.deepcopy(list_a),再修改list_b将不会影响到list_a了。即使嵌套的列表具有更深的层次,也不会产生任何影响,因为深拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何关联。
代码举例:
import copy
a=[1,2,3,['a','b']]
b=a
c=copy.copy(a)
d=copy.deepcopy(a)
e=a.copy()
f=[]
for i in range(len(a)):f.append(a[i])
g = [each for each in a]a.append('happy')
print('a:',a,id(a))
print('b:',b,id(b))
print('c:',c,id(c))
print('d:',d,id(d))
print('e:',e,id(e))
print('f:',f,id(f))
print('g:',g,id(g))a.append('luck')
a[3].append(3)
print('-'*50)
print('a:',a,id(a))
print('b:',b,id(b))
print('c:',c,id(c))
print('d:',d,id(d))
print('e:',e,id(e))
print('f:',f,id(f))
print('g:',g,id(g))
输出结果:
a: [1, 2, 3, [‘a’, ‘b’], ‘happy’] 43169800
b: [1, 2, 3, [‘a’, ‘b’], ‘happy’] 43169800
c: [1, 2, 3, [‘a’, ‘b’]] 43171080
d: [1, 2, 3, [‘a’, ‘b’]] 43171016
e: [1, 2, 3, [‘a’, ‘b’]] 43170888
f: [1, 2, 3, [‘a’, ‘b’]] 43170824
g: [1, 2, 3, [‘a’, ‘b’]] 43170760
a: [1, 2, 3, [‘a’, ‘b’, 3], ‘happy’, ‘luck’] 43169800
b: [1, 2, 3, [‘a’, ‘b’, 3], ‘happy’, ‘luck’] 43169800
c: [1, 2, 3, [‘a’, ‘b’, 3]] 43171080
d: [1, 2, 3, [‘a’, ‘b’]] 43171016
e: [1, 2, 3, [‘a’, ‘b’, 3]] 43170888
f: [1, 2, 3, [‘a’, ‘b’, 3]] 43170824
g: [1, 2, 3, [‘a’, ‘b’, 3]] 43170760
参考自 https://www.cnblogs.com/work115/p/5619541.html
https://www.cnblogs.com/Black-rainbow/p/9577029.html
Python中赋值,深拷贝和浅拷贝相关推荐
- python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝
在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...
- python中的深拷贝与浅拷贝
浅拷贝的时候,修改原来的对象,深拷贝的对象不会发生改变. 对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷贝这个对象,而只是拷 ...
- python中关于深拷贝和浅拷贝的详解
python中关于深拷贝和浅拷贝的详解 概述 在python的语法中,有两种变量的拷贝方式 一种是深拷贝,一种是浅拷贝 我们先说深拷贝 语法 这里需要通过导入系统的copy模块中的deepcopy才可 ...
- python中深拷贝和浅拷贝_**Python中的深拷贝和浅拷贝详解
甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型 来确认变量到底是什么类型. 单独赋 ...
- python深浅拷贝的底层理解_理解python中的深拷贝与浅拷贝
python中浅拷贝和深拷贝的区别如下: 1. copy.copy 等价于切片[:] 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2个列表是不同的,但是子列表指向的仍然是同一个地址 2. co ...
- 关于python中的深拷贝和浅拷贝的总结
可变对象和不可变对象 了解深拷贝和浅拷贝之前你得先知道什么时可变对象什么是不可变对象传送门 深拷贝和浅拷贝拷贝不可变对象时 import copy a = 1 b = copy.copy(a) c = ...
- python中的引用、浅拷贝和深拷贝
在python中,有一句话:"一切皆为对象,一切皆为对象的引用",所以 只要记住这句话就很容易清楚python中的引用.浅拷贝和深拷贝了. 1. 引用 python中的引用是经常使 ...
- Python中赋值、浅拷贝、深拷贝
一.赋值 Python中赋值就是对对象的简单引用,这一点与C++不同,如下: a = [1, '123', [12, 'C']] b = a 在上述情况下,a和b是一样的,他们指向同一片内存,b不过是 ...
- vb.net中递归退到最外层_面试题被问到再也不慌,深究JavaScript中的深拷贝与浅拷贝...
" 点个关注,养成习惯,带你python爬虫的过程中学习前端 " JavaScript中的深拷贝和浅拷贝是前端面试中频繁被问到的一道题, 于是我也自己去查阅了一些资料, 然后动手敲 ...
- C语言中的深拷贝和浅拷贝
http://www.cnblogs.com/zhanggaofeng/p/5421804.html C语言中的深拷贝和浅拷贝 //C语言中的深拷贝和浅拷贝 #define _CRT_SECURE_N ...
最新文章
- 强化学习vs遗传算法-人工智能在模拟领域的应用
- 2015浙江财经大学ACM有奖周赛(一) 题解报告
- Linux x64 下 Matlab R2013a 300 kb 脚本文件调试的 CPU 占用过高问题的解决办法
- seo建设者_SEO建设者,有哪些说不出的苦?
- c# DirectoryInfo 类和 FileInfo 类
- 计算机系统基础:程序与运算
- Jerry的ABAP原创技术文章合集
- linux java usb 串口_2019-11-02 Linux下USB-串口的使用
- 一般向量空间的基变换_MIT—线性代数笔记30 线性变换及对应矩阵
- 【codevs2098】【Tyvj1625】化工厂装箱员,煞笔的人打煞笔的DP
- 7-6 掉入陷阱的数字 (15 分)
- Atitit 法学体系树与知识点attilax大总结 法学体系		 0301法学类	030101 法学理论	宪法 行政法 民法 商法 婚姻法和继承法 经济法 社会法 刑法 民事诉讼法 行政诉讼法
- SHA1散列算法及其C++实现
- 整理了81个Python实战项目列表,都有完整且详细的教程
- 老徐WEB:CSS伪类和伪元素详解
- [深度学习]动手学深度学习笔记-11
- slides.jquery.js快速实现轮播图效果
- 24 款效率办公神器,简直不要太强大!
- 专升本英语——语法知识——高频语法——第一节 时态和语态——动词时态被动语态(全称)【学习笔记】
- python tensorflow2 deeplearning 音频处理 声学事件检测
热门文章
- shiro中文api_Shiro
- kettle 先删除后插入_Kettle:使用触发器和快照表进行增量数据同步
- 学习android 画板源代码,Android实现画画板案例
- 实验楼 linux内核原理与分析,《Linux内核原理与分析》第一周作业 20189210
- 计算机主板另一个名称,主板名称太复杂 看这几点就秒懂了
- 蓝桥杯第七届决赛之---阶乘位数
- gaf处理一维故障信号_【推荐文章】改进局部均值分解的齿轮箱复合故障特征提取...
- ddns 被解析为127.0.0.1_我为北京冬奥加油,2020.2.1-2.10冬奥知识分享
- cmd查询Oracle中的表 成表格显示,oracle如何通过cmd导出某个用户下的所有表
- matlab单元数组和结构,Matlab使用单元数组和结构数组