科技资讯眺望|Python笔记11_深拷贝浅拷贝
主要内容:
- 小目标:掌握对象拷贝
- 主要内容:拷贝引发问题 , 问题分析 , 拷贝问题避免方式
1. 几个例子1.1 理解引用
a = 10b = aa = 20print(a, b)问题:a , b的值分别为? 结果:20 10 为什么?- 数字是一种不可变数据结构 ,
- ab的赋值在Python中称作引用 , 每个变量名对应一个对象;
- b = a , 之后 , a与b都指向10这个对象
- a = 20之后 , a指向20 , b没有变化
- 可以通过id(x)看变量地址;
p1 = [[1,2,3],4]#p2为创建的新列表p2 = list(p1)#p1第一个元素为子列表 , 对子列表第一个元素进行修改p1[0][0] = 10#p2对对1个元素修改p2[1] = 100print(p1, p2)问题:p1 , p2的值分别为?结果:[[10, 2, 3], 4] [[10, 2, 3], 100]
问题:为什么p1,p2中子列表的值一样 , 但是第二个元素值不一样 ;
分析:
1. p2 = list(p1) , 创建新列表 , 但是 , p1的元素没有改变 , p1,p2如下
修改后的结果:
对p1[0][0]进行修改 , 对v1的子列表进行修改 ,
但是p1,p2没有变化对p2[1]修改 ,
因为p2[1]为不可变数据结构 , 所以p2[1]发生变化 , p1不变
- p2 = list(p1)这个操作就是一个浅拷贝
import copy- copy.copy:浅拷贝 , 只对当前对象进行拷贝 , 没有对子元素进行拷贝
- copy.deepcopy:深拷贝 , 对象及其子对象
import copyp1 = [[1,2],4]p2 = copy.copy(p1)p3 = copy.deepcopy(p1)#先来看地址:print('%x %x %x'%(id(p1),id(p2),id(p3)))#在来看第一个元素地址:print('%x %x %x'%(id(p1[0]),id(p2[0]),id(p3[0])))#对子列表修改p1[0][0] = 10p2[1] = -1p3[0][1] = 100print('p1:',p1)print('p2:',p2)print('p3:',p3)可以看到:p1与p2的第一个元素:列表 , 是一个对象 , 对其修改会影响p1,p2p1,p2与p3的第一个元素不是同一个元素 , 所以修改对p3不会有影响p1,p2,p3中的第二个元素为数字 , 所以修改任意一个 , 不会对其他造成影响- 问题实质:
迭代对象中的元素是否可变(列表 , 字典等) , 可变就使用深拷贝 , 浅拷贝操作:copy.copy , list, dict等3. 可变与不可变:- 元组可变:元组的元素为列表 , 例如:([1,2,3],3,[5])
- 拷贝问题 , 主要对列表字典等可变对象操作引发 ,
- 如果对列表字典进行拷贝 , 推荐使用深拷贝;
推荐阅读
- 小红猪带你看科技|七夕节送女朋友必备左点小艾智能艾灸器X8,3天众筹500万
- 浪浪科技精选|超频三GI-CX240 ARGB水冷,极致性能冷酷到底
- 驱动之家资讯|支付宝搜索流量全面开放:麦当劳、肯德基、星巴克等抢先升级“品牌直达”
- ITheat热点科技|可搭载高规格显卡,AMD将发布新移动端处理器:开放完整PCIe通道
- 爱因儿科技|入侵盖茨、马斯克、巴菲特等名人推特账号的黑客被抓了!最小的17岁
- 真理科技原创 知道为什么自己的Vlog不如别人的好吗?飞宇VLOG pocket2体验
- 小米科技|小米正式官宣以旧换新,支持小米10系列等5款机型,你等到了吗?
- 小米科技|数亿米粉始料未及!小米2日正式宣布,网友:太良心了!
- 快资讯|时间和细节都吻合,《穿越火线》变悬疑片?撞倒路小南的就是大蔚
- 不爱之恩|成员相关更新,runningman最新资讯:狗哥与妻子合照曝光
