挖一挖python中的深浅拷贝问题
前几天在做面试题的时候,遇到一个与Python深浅拷贝的问题,今天总结出来一个方法,能够快速判断在对一个对象复制后,新对象与原来对象是否会互相影响的方法。
先抛出结论,然后我们对结论进行验证~~~
先看要被复制的数据类型是否是可变的,我们知道,在Python中:
不可变数据类型:整型,字符串,元组,
可变数据类型:列表,集合,字典。
情况1:如果对整型、字符串和元组类型等不可变数据对象,无论采用=、copy还是deepcopy方法,都相当于是引用了原来对象的内存地址,还是指向了同一块内存。
上代码验证下:
import copy a = '哈哈'
# 1、 复制不可变的数据类型
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
# 都是用的同一个内存地址 # print(id(a)) 9906224
# print(id(b)) 9906224
# print(id(c)) 9906224
# print(id(d)) 9906224
如上例,我们对字符串a分别进行了3种赋值操作,他们都具有相同的id号,这是浅拷贝。
情况2:如果数据类型是诸如列表、字典等可变的数据类型,我们需要看一下数据对象是否包含复杂数据类型,简单来说,是否是列表嵌套列表,字典嵌套字典:
lis1 = [1,2,3,4,5,6] #简单列表
lis2 = [1,2,3,[4,5,6]] #包含子列表的复杂列表 dic1 = {'name':'jay','age':18} #简单字典
dic2 = {'name':'jay','age':18,{'addr':'Bj','sex':'famle'}} #包含子字典的复杂字典
对于深拷贝来说(copy.deepcopy):无论是简单还是复杂的数据结构,二者完全独立,两份互不干扰
import copy lis = [1,2,[3,4]]
lis1 = copy.deepcopy(lis)
lis1[2][0] = 'ha'
# print(lis1) # [1, 2, ['ha', 4]]
# print(lis) # [1, 2, [3, 4]] #旧列表纹丝未动
对于浅拷贝来说:
简单数据元素如果修改,互不干扰;复杂类型的(嵌套列表、字典)就会互相影响了
import copy x = [1,2,3,['ahh','lalla']]
y = copy.copy(x) y[0] = 88
print(x) # ---> [1, 2, 3, ['ahh', 'lalla']], 列表没有改变 y[3][0] = 'simon'
print(x) # ---> [1, 2, 3, ['simon', 'lalla']], 列表改变了
这是我自己总结的记忆方法:
浅拷贝:分2种情况:
(记忆方法:小明抄小红的作业,小红把最后一个题的答案写在了背面,并注明:答案见背面
小明把前面的作业抄完了,最后也写上了答案见背面,但是小明的试卷后面并没有答案,
所以此时两人的试卷情况:前面的作业互补干扰,是独立的,但是最后一个题的作业用的是同一份) 第一种情况:复制的 对象中无 复杂 子对象,原来值的改变并不会影响浅复制的值,
同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。 第二种情况:复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表),
改变原来的值 中的复杂子对象的值 ,会影响浅复制的值。
挖一挖python中的深浅拷贝问题的更多相关文章
- 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝
Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...
- Python 中的深浅拷贝
Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...
- Python中的深浅拷贝
1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...
- Python基础【3】:Python中的深浅拷贝解析
深浅拷贝 在研究Python的深浅拷贝区别前需要先弄清楚以下的一些基础概念: 变量--引用--对象(可变对象,不可变对象) 切片(序列化对象)--拷贝(深拷贝,浅拷贝) 我是铺垫~ 一.[变量--引用 ...
- Python中的深浅拷贝,赋值及引用
简单来说,若对象a中存的是列表或字典等可变对象,b对a的浅拷贝只是对对象第一层的复制,修改b第二层的元素仍然会影响两个对象. 深拷贝则是不会影响原来的对象. import copy.copy() 浅拷 ...
- 【Python】Python中的深浅拷贝
[转]python 复制(拷贝)对象 -- ::| 分类: Python |举报|字号 订阅 下载LOFTER我的照片书 | 需求: 你想复制一个对象.因为在Python中,无论你把对象做为参数传递, ...
- 浅谈Python中的深浅拷贝的区别
深.浅拷贝总结 深拷贝 拷贝可变数据类型,如列表容器: a = [1, 2, [3, 4]] b = copy.deepcopy(a) a 与 b 所指的列表容器的空间地址不一致,即 id(a) != ...
- 关于Python中的深浅拷贝
之前一直认为浅拷贝是拷贝内容的第一层,但是不开辟内存,只是增加新的指向原来的内容:深拷贝是拷贝是拷贝每一层并开辟内存. 其实这个是不严谨的不正确的. 从以上可以看出,浅拷贝中当时可变类型的时候,内存是 ...
- js中的深浅拷贝
js中的深浅拷贝 js中有深拷贝.浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数.对象.数组)而言的,大概理解的就是: 浅拷贝: 拷贝出的对象c和原始对象o,c和o在key对应的val ...
随机推荐
- Myeclipse学习总结(5)——Myeclipse常用快捷键再学习
Ctrl+1 快速修复 Ctrl+D: 删除当前行 Ctrl+Q 定位到最后编辑的地方 Ctrl+L 定位在某行 Ctrl+O 快速显示 OutLine Ctrl+T 快速显示当前类的继承结构 ...
- Ubuntu14.04 安装CUDA7.5 + Caffe + cuDNN
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50961542 花了一天时间,在电脑上安 ...
- java陷阱之spring事物未提交和回滚导致不可预知问题
案发现场 //防止全局配置了 所以这里定义sprnig 不托管事物 @Transactional(propagation = Propagation.NOT_SUPPORTED) public boo ...
- Boost.Asio c++ 网络编程翻译(16)
TCP异步服务端 核心功能和同步服务端的功能类似,例如以下: class talk_to_client : public boost::enable_shared_from_this<talk_ ...
- Android应用之——微信微博第三方sdk登录分享使用过程中的一些常见问题
前言 近期在使用第三方登录和分享的过程中遇到了非常多问题,一方面能够归结为自己经验的不足,还有一方面事实上也说明了官方文档的含糊不清.这篇博文不会写关于怎样使用第三方登录分享,由于官方文档已经写明了步 ...
- 去哪网实习总结:JavaWeb中文传參乱码问题的解决(JavaWeb)
本来是以做数据挖掘的目的进去哪网的.结构却成了系统开发... 只是还是比較认真的做了三个月.老师非常认同我的工作态度和成果... 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题,分享给 ...
- C/C++学习:函数指针
曾经在书上看到函数指针相关的都没怎么重视.可是近期在实际的工作中却派上了用场.所以认真地学习了一遍. 函数指针的申明 申明一个函数指针非常easy,就是将函数申明中的函数名替换为一个指针就可以: C/ ...
- weblogic管理脚本
start.sh Java代码 #!/usr/bin/bash # # start.sh # @auth: zhoulin@lianchuang.com # SERVER_STATUS () { s ...
- php global GLOBALS[]变量
$a=123; function aa() { Global $a; //如果不把$a定义为global变量,函数体内是不能访问函数体外部的$a的,但是可以定义一个相同的名字$a,此时这个变量是局部变 ...
- TCP/IP协议族简介
OSI网络分层介绍 网络结构的标准模型是OSI模型,由国际互联网标准化组织定义的网络分层模型.虽然目前没有完全按照这种模型实现的网络协议栈,但是学习这个模型对于我们理解网络协议还是很有帮助的. 1.O ...