简析python深浅拷贝
1.基础知识
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | a = 123 b = 123 <br> #内存函数id,返回变量的内存地址 id (a) id (b) c = "123" d = c id (c) id (d) f = [ 1 , 2 , 3 ] g = [ 1 , 2 , 3 ] h = f id (f) id (g) id (h) |
使用内存分析工具winDbg查看这两个变量的内存分布
操作步骤:
1.使用系统计算机工具程序员模式 复制粘贴id 得到16进制内存地址
2.打开winDbg粘贴16进制数据,得到内存信息
观察所得:
- 内存地址没有改变,内存中的值变了(对原内存就地完成修改)
- 内存地址变了,内存中值也变了(没有对内存进行修改,而是在新的内存中放置新的值)
对于数据对象,是否支持在原内存进行修改,可分为:
可变对象:列表,字典,集合(原内存,内存地址没变)
不可变对象:数字、字符串、元组(新内存,内存地址改变了)
2.深浅拷贝
拷贝:复制一个对象
2.1 浅拷贝
copy.copy() 效率高,开销少节约内存,但是数据不隔离,只复制父节点
为什么修改浅拷贝的数据,没有对其他数据进行影响
- 因为不可变对象,不会发生变化,当我们讨论深浅拷贝时,只针对可变对象
1 2 | dd = copy.copy(d) #字典创建新的内存 m = copy.copy( "123" ) #字符串,整数,列表没有创建新的内存 |
2.2 深拷贝
copy.deepcopy() 效率低,开销大会开辟新内存,数据完全隔离,复制父子节点
所有的变量都是可以深拷贝的吗?
- 不是,例如队列 有锁 不能拷贝
dd=copy.deepcopy(d)
2.3 相关面试题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | """ 张三的成绩如下 张三={ "语文":70, "数学":65, "英语":66, "生物":69, "政治":78, "跳远":[1.2,1.3,1.2] } 李四的语文成绩比张三高20,跳远成绩最后一次是1.5,其他成绩与张三一样 王舞的语文成绩比张三高10,其他成绩与张三一样 请使用最少的代码完成数据处理,使得下面的代码可以同时打印三个人的成绩 """ import copy zhangsan = { "语文" : 70 , "数学" : 65 , "英语" : 66 , "生物" : 69 , "政治" : 78 , "跳远" :[ 1.2 , 1.3 , 1.2 ] } lisi = copy.deepcopy(zhangsan) lisi[ '语文' ] + = 20 lisi[ '跳远' ][ - 1 ] = 1.5 wangwu = copy.copy(zhangsan) wangwu[ '语文' ] + = 10 print (f "张三成绩={zhangsan}\n李四成绩={lisi},\n王舞成绩={wangwu}" ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)