当前位置: 首页 > news >正文

Python基础(①④内存管理机制)

Python 的内存管理机制可以简单理解为 “自动帮你管钱”—— 你不用手动申请或释放内存,Python 会自动处理。

1. 引用计数

a = [1,2,3]  # 列表[1,2,3]的引用计数=1
b = a        # 引用计数=2(a和b都指向它)
del a        # 引用计数=1(只剩b了)
b = 100      # 引用计数=0(没人指向列表了),内存被自动回收

当一个对象的引用计数降为0时,Python 的垃圾回收机制会认为这个对象不再被任何变量使用,然后自动回收其占用的内存。

当引用计数变为 0 时,Python 的垃圾回收器就会识别出这个列表是“垃圾”(即无用的内存),并自动释放它占用的内存。从那一刻起,列表 [1,2,3] 的内容就从内存中消失了。

2. 垃圾回收

# 创建两个空列表,互相引用
a = []
b = []
a.append(b)  # a引用b
b.append(a)  # b引用a# 现在删除a和b的引用
del a
del b

这时候,两个列表已经没有变量指向它们了,但因为它们互相引用(a 里有 b,b 里有 a),导致引用计数都不为 0
如果只靠引用计数,这两个列表会一直占着内存,变成 “内存垃圾”。

把 a = [] 想象成:有一个空盒子 A,上面贴了个标签 a(方便你找到它)。
把 b = [] 想象成:有一个空盒子 B,上面贴了个标签 b。

现在执行 a.append(b):
相当于往盒子 A 里放了一张纸条,纸条上写着 “盒子 B 在哪”(也就是记录了 B 的位置)。
这时候,盒子 B 除了自己的标签 b,又多了一个被盒子 A “记住” 的引用,所以引用计数 + 1。

再执行 b.append(a):
相当于往盒子 B 里也放了一张纸条,写着 “盒子 A 在哪”。
同理,盒子 A 的引用计数也 + 1(除了标签 a,又被盒子 B 记住了)。

现在,如果你把标签 a 和 b 撕掉(del a; del b):

盒子 A 和 B 虽然没了外部标签,但盒子 A 里的纸条还指着 B,盒子 B 里的纸条还指着 A。
就像两个盒子互相用绳子拴着,虽然没人拿着它们了,但它们自己还互相牵着,所以 “引用计数”(被多少东西指着)都没降到 0。

这就是 “[] 指向 []” 的本质:列表(盒子)里存了另一个列表(盒子)的位置,形成了互相 “惦记” 的关系,导致即使外部没人用了,它们的引用计数也不为 0。

3. 内存池

import sys# 查看两个小整数的内存地址
a = 10
b = 10
print("小整数的内存地址:")
print(id(a))  # 输出a的内存地址
print(id(b))  # 输出b的内存地址
print("两个地址是否相同?", id(a) == id(b))  # 结果为True# 查看两个大整数的内存地址
c = 1000000
d = 1000000
print("\n大整数的内存地址:")
print(id(c))  # 输出c的内存地址
print(id(d))  # 输出d的内存地址
print("两个地址是否相同?", id(c) == id(d))  # 结果为False

小整数10的两个变量a和b指向同一个内存地址(内存池里的缓存)
大整数1000000的两个变量c和d指向不同的内存地址(没有使用内存池)

这就是内存池的效果:

Python 会提前在内存池里缓存一些常用的小数据(比如 - 5 到 256 之间的整数、短字符串)
当你再次创建相同的小数据时,直接复用内存池里的地址,不用重新申请内存
大数据不放进内存池,每次创建都会新申请内存

这样做的好处是:小数据使用频繁,复用内存能节省时间和空间,让程序跑得更快。


文章转载自:

http://Szm0b1SO.ktcfL.cn
http://LNqhCPo3.ktcfL.cn
http://ydbjt5UJ.ktcfL.cn
http://4g9fl4aD.ktcfL.cn
http://4f8sbOhQ.ktcfL.cn
http://6lpc2ah4.ktcfL.cn
http://3izNVhEq.ktcfL.cn
http://iWSICwce.ktcfL.cn
http://GGAwE5OZ.ktcfL.cn
http://qIcmwRyH.ktcfL.cn
http://az70g5Lm.ktcfL.cn
http://GJWqEoAz.ktcfL.cn
http://IBt7gH9u.ktcfL.cn
http://nuJspKYw.ktcfL.cn
http://VF5Qjt89.ktcfL.cn
http://D3G5yz08.ktcfL.cn
http://2WilziN3.ktcfL.cn
http://99kUUBUf.ktcfL.cn
http://FMWxihsf.ktcfL.cn
http://UbYjvLL1.ktcfL.cn
http://ut8OwzJb.ktcfL.cn
http://aIRJLzD4.ktcfL.cn
http://473iyRsf.ktcfL.cn
http://z4bwUJ95.ktcfL.cn
http://dlN5wpnJ.ktcfL.cn
http://hapRZytu.ktcfL.cn
http://q1N50DiJ.ktcfL.cn
http://qPtn99Bp.ktcfL.cn
http://TOipIcHd.ktcfL.cn
http://jiEyrynr.ktcfL.cn
http://www.dtcms.com/a/366998.html

相关文章:

  • 脑卒中目标检测含完整数据集
  • Unity核心概率⑤:GameObject
  • 【Python办公】tkinter词云图生成器
  • 使用Qt Charts实现高效多系列数据可视化
  • 【数据可视化-106】华为2025上半年财报分析:用Python和Pyecharts打造炫酷可视化大屏
  • tsconfig.json的target和module详解
  • 无人机气象观测技术
  • 【开题答辩全过程】以 小众商户小程序为例,包含答辩的问题和答案
  • house (ai)
  • Dify 从入门到精通(第 75/100 篇):Dify 的实时流式处理进阶(高级篇)
  • 从质疑到真香:小白使用「飞牛NAS」+「节点小宝」的花式操作
  • 关于NET Core jwt Bearer Token 验证的大坑,浪费3个小时,给各位兄弟搭个桥。
  • 人工智能学习:传统RNN模型
  • PyTorch DDP 随机卡死复盘
  • JVM 类加载全过程
  • 关于IDEA构建Gradle项目时报错“contentRootData“ is null的一次排查
  • devcpp 5.11的详细安装步骤
  • 高效菜单管理页面:一键增删改查
  • jmeter压测工具使用详情
  • finally 与 return的执行顺序
  • Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
  • 邦芒干货:新入职场的人必须要知道的三大事情
  • JY-H818|科智立RFID高频读写器产品参数解析
  • LVDS系列27:Xilinx 7系 OSERDESE2原语(三)
  • [晕事]今天做了件晕事91,glibc,rand之前必须设置种子
  • C语言内存精讲系列(七):深入解析 x86 实模式
  • 远场代码学习_FDTD_farfield
  • 五、插值与拟合
  • 今天我们继续学习Linux中的shell脚本流程控制内容
  • 大模型微调之LORA核心逻辑