1.基础知识
a=123 b=123
#内存函数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() 效率高,开销少节约内存,但是数据不隔离,只复制父节点
为什么修改浅拷贝的数据,没有对其他数据进行影响
- 因为不可变对象,不会发生变化,当我们讨论深浅拷贝时,只针对可变对象
dd=copy.copy(d) #字典创建新的内存 m=copy.copy("123") #字符串,整数,列表没有创建新的内存
2.2 深拷贝
copy.deepcopy() 效率低,开销大会开辟新内存,数据完全隔离,复制父子节点
所有的变量都是可以深拷贝的吗?
- 不是,例如队列 有锁 不能拷贝
dd=copy.deepcopy(d)
2.3 相关面试题:
""" 张三的成绩如下 张三={ "语文":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}")
标签:内存地址,python,简析,内存,成绩,拷贝,copy,id From: https://www.cnblogs.com/lgs-tech/p/17458296.html