python-----内存管理机制
2024-10-09 08:56:47
一、深浅拷贝的区别
深浅拷贝一般是在列表嵌套列表的情况下去讨论
浅拷贝:只拷贝列表中对象的引用,嵌套列表中的数据是不会进行全部拷贝的
深拷贝:会把对象里面所有的数据都拷贝一份,不再只拷贝对象的引用,会另开内存存储
# 浅拷贝: 只拷贝列表中对象的引用,a的值发生变化后会影响到f
a = [11,22,33]
b = [1,2,3,a] # b里面调用a
f = b.copy() # copy方法是浅拷贝
a.append("新值a")
print("f的值", f) # 结果: [1, 2, 3, [11, 22, 33, '新值a']]
# 从结果可以看到,修改了a的之后,d的值也会发生变化 # 深拷贝会把对象里面所有的数据都拷贝一份,另开一个内存存储,所以修改原来的对象拷贝出来的不受影响
import copy
a = [11,22,33]
b = [1,2,3,a]
# 需要调用copy中的deepcopy函数
f = copy.deepcopy(b)
a.append("新值a")
print("f的值", f) # 结果:[1, 2, 3, [11, 22, 33]]
# 从结果可以看到,修改了a的值并没有影响到f的值
二、小整数池
python中的整数池也是为了节约内存而设计的, 避免为整数频繁申请和销毁内存空间
小整数池范围:-5到256
>>> a = -5
>>> b = -5
>>> id(a)
140732735804256
>>> id(b)
140732735804256
>>> a = -6
>>> b = -6
>>> id(a)
3147946898928
>>> id(b)
3147918100496
>>> a = 256
>>> b = 256
>>> id(a)
140732735812608
>>> id(b)
140732735812608
>>> a = 257
>>> b = 257
>>> id(a)
3147918100496
>>> id(b)
3147918100368
上述代码可以看到,-5到256之间的数字,打印的内存地址都是一样的,注意不要直接在pycharm运行,因为pycharm会做优化,导致打印的内存地址是一样的,需要在python命令行中运行
三、大整数池
开始是空的,如果第一次定义一个字符串只有数字,字母,下划线三个元素组成,python会把这个值存储到大整数池,下次调用就会去这个大整数池调用
a = 'a_bc11'
c = 'a_bc11'
d = 'a_ !bc11'
print(id(a)) # 结果:2156715830048
print(id(c)) # 结果:2156715830048
print(id(d)) # 结果:2156713793048
从结果可以看到a,c两个内存地址是一样的,因为都是调用大整数池,d里面因为存在其他特殊字符,导致a,c内存地址不一样
最新文章
- Nova reboot 和 lock 操作 - 每天5分钟玩转 OpenStack(32)
- hdu Caocao's Bridges(无向图边双连通分量,找出权值最小的桥)
- hdu 3501 Calculation 2 (欧拉函数)
- 魔方阵算法及C语言实现
- Android开发手记(24) Log的使用及颜色的更改
- JMeter数据库性能测试
- 学习PrintWriter类 .
- Payload Inject And Fake
- 最近一年多我总结的常用mate标签-常用mate标签
- .Neter玩转Linux系列之一:初识Linux
- Java集合源码分析(四)HashMap
- Arrange the Bulls [POJ2441] [状压DP]
- Python之列表方法
- playframework 编译打包过程失败
- SQL Server 序列(SEQUENCE)使用
- 微信公众号平台上传文件返回错误代码:40005 invalid file type
- swust oj 962
- 会话的保持和form表单
- 洛谷.4115.Qtree4/BZOJ.1095.[ZJOI2007]Hide捉迷藏(动态点分治 Heap)
- ORACLE INSTANCE与EM系统