Python 那些永远用不到的对象,我们称之为「垃圾」
我们知道使用 Python 可以创建对象,当我们去引用它的时候,系统会开辟一个内存空间存放对象,不过可能有些对象我们用完之后,永远再也不会去使用了,那这对象不能一直留在内存里边吧,对象已经废了,也就成为了「垃圾」,垃圾要清理掉,内存才能腾出位置给别的程序使用。
那么:
Python是怎么回收垃圾的?
先来了解一下「引用次数」,在 Python 的内置模块 sys 有一个 getrefcount 方法,通过它我们可以得到对象被引用的次数:
比如我们定义这样一个「s」:
这里得到的结果为 2 次引用,其中一次是 s,一次是 getrefcount。
接下来我们看看这样的代码:
当我们执行完 fxxk 方法之后,在它下面的 print 调用会报错,也就是说我们无法再去引用对象 s 了,因为它已经被回收。
当执行完 fxxk() 之后,对象 s 的引用数量为 0,而在 Python 的垃圾回收算法中,一个主要的点就是,当对象的引用数量为 0,说明这个对象已经成为「垃圾」了,Python 会将这个对象回收掉,从而释放资源。
通过统计引用次数来释放资源,是相对高效可行的,不过也有存在这样的现象:对象之间相互循环引用,会导致引用数量为一直不为 0,那么这样的垃圾是回收不了的,这就可能会造成内存泄漏。
所以在 Python 新版本中,补充了垃圾回收机制算法——标记清除法和分代收集。
所谓标记清除,就是遍历所有对象,通过链表逐个对象追踪标记到的这些对象是可达的,那么剩下那些对象就是不可达的,说明它们是垃圾,回收掉,这样就可以避免对象循环引用而没办法回收的问题了。
因为每次标记清除的时候,肯定是占用系统资源的,这时候就有人想到,是不是可以分代收集,也就是说,分成三代,把第一次遍历的对象视为第 0 代,那么第一次遍历完活下来的对象,就把它们放入第二代,第二代就不会被那么「严格」的去扫描,如果第二次遍历,第二代的对象又存活,那么就放入第三代,在第三代里面的对象就更「安全」了。
因为对象活得越久,说明它越不是「垃圾」。
以上,我们说的 Python 垃圾回收机制,都是自动的,不用我们亲自来清理垃圾。
那如果我们想自己手动来回收垃圾,可不可以实现呢?
答案是肯定的。
Python手动回收垃圾
我们可以通过 del 命令来删除对象的引用,然后使用 Python 的 gc 模块,调用 collect 方法就可以实现。
现在来写个例子给你参考一下:
代码很简单,这里我们创建了 handsomeb 对象,见一个女生爱一个。。。
主要的是最后两行代码,当我们使用 del handsomeb 的时候,实际上就是将 handsomb 这个对象给删除释放掉,不过这个时候还存在那些和 handsomeb 的关联对象 Girl 们,她们已经没有什么用了,我们可以使用 gc.collect(),将和 handsomeb 关联的对象们都给释放掉,这样就实现了手动回收垃圾。
你还可以到这里了解更多相关内容:
https://docs.python.org/zh-cn/3.8/library/gc.html
ok,以上就是小帅b今天给你带来的分享,关于 Python 的垃圾回收问题,面试也常常会被问到,希望对你有帮助。
推荐阅读
Pandas处理数据太慢,来试试Polars吧!
懒人必备!只需一行代码,就能导入所有的Python库
绝!关于pip的15个使用小技巧
介绍10个常用的Python内置函数,99.99%的人都在用!
可能是全网最完整的 Python 操作 Excel库总结!
Python 那些永远用不到的对象,我们称之为「垃圾」相关推荐
- python柱形图代码_Python数据可视化:基于matplotlib绘制「条形图」
简介 条形图 (bar chart)是用宽度相同条形的高度或长短来表示数据多少的图形,可以横置或纵置.纵置时的条形图也称为 柱形图 (column chart). 绘制条形图 1 import mat ...
- jsonobject json对象里面_「jsonobject」用JSONObject解析和处理json数据 - seo实验室
jsonobject 本文中主要介绍jsonobject处理json数据时候的一些常用场景和方法. (一)jar包下载 所需jar包打包下载百度网盘地址:https://pan.baidu.com/s ...
- Python文字转换语音,让你的文字会「说话」,抠脚大汉秒变撒娇萌妹
APP 也有文字转换为语音的功能,虽然听起来很别扭,但是基本能解决长辈们看不清文字或者眼睛疲劳,通过文字转换为语音来获取信息. 我们用 Python 能否实现文字转语音呢,可以的,百度有个语音接口,可 ...
- Python学习——02-Python基础——【9-面向对象进阶】——isinstance(obj,cls)、反射等...
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(objec ...
- 使用Python,OpenCV转换颜色空间,追踪对象的轨迹
使用Python,OpenCV转换颜色空间,追踪对象的轨迹 1. 效果图 2. 源码 参考 这篇博客可以看作是之前俩篇博客的融合,将介绍如何使用Python,OpenCV转换颜色空间,并利用HSV追踪 ...
- 使用Python,OpenCV检测摄像机到标记对象的距离
使用Python,OpenCV检测摄像机到标记对象的距离 1. 效果图 2. 三角形相似性是什么? 3. 三角形相似性检测距离原理 4. 使用Python,OpenCV检测标记对象 5. 源码 参考 ...
- 如何在python中找到两个日期时间对象之间的时差?
本文翻译自:How do I find the time difference between two datetime objects in python? 如何分辨两个datetime对象之间的时 ...
- Python学习教程(Python学习路线):Day08-面向对象编程基础
Python学习教程(Python学习路线):面向对象编程基础 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程&qu ...
- python中的is判断引用的对象是否一致,==判断值是否相等
python中的is判断引用的对象是否一致,==判断值是否相等 a = 10 b = 20 list = [1,2,3,4,5] print(a in list) print(b not in lis ...
最新文章
- 学python培训到底能干嘛
- freemarker if判断
- Python 实现感知器模型、两层神经网络
- element elcolumn 使用本地图片_年末了,教你如何使用Python实现上班摸鱼
- SAP Spartacus Ngrx 使用的一些准则
- 超好用的27个谷歌Chrome浏览器使用技巧
- Xshell登录Linux服务器 提示WARNING! The remote SSH server rejected X11 forwarding request 及 提示符显示-bash-4.2#
- 7-11 数列求和-加强版 (20 分)
- matplotlib动态图和视频保存
- [Java] 蓝桥杯ALGO-93 算法训练 反置数
- NGSL + NAWL 单词表 以及学习网站
- Linux多线程编程入门
- pcb边框是自己画_说一下Altium Designer软件画不规则PCB板边框的方法
- .net dll反编译出现的问题,以及部分修复的方法
- 《吴忠与富平》之四:汉三水属国(北地属国、安定属国)
- Android Studio中Intent的一些相关知识
- 用iframe的方式 解决 window.open() 不能打开多个窗口的问题
- EAX、ECX、EDX、EBX、ESI、EDI、ESP、EBP寄存器
- 《快学Scala》第二章练习题答案+概述
- HCNA之华为ensp基本操作总结
热门文章
- python 百度词典_python在线抓取百度词典的翻译结果翻译单词
- 模拟手机浏览器_干货系列,让浏览器自己动起来,解放双手
- java如何写线程外部类_廖雪峰Java读书笔记(六)--多线程(或称并发)
- java设计模式adapter_Java设计模式--适配器(Adapter)模式
- a7100换电池_动动手你也行 篇十四:冲动是魔鬼——单反电池换芯失败记
- 比较全面的MySQL优化参考
- cmd命令安装composer踩坑
- mysql-5.6.16-win32_mysql-5.6.16-win32免安装配置方法
- camunda流程定义表无数据_BPM - 业务流程管理
- keras 多层lstm_《Keras 实现 LSTM》笔记