我们知道使用 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 那些永远用不到的对象,我们称之为「垃圾」相关推荐

  1. python柱形图代码_Python数据可视化:基于matplotlib绘制「条形图」

    简介 条形图 (bar chart)是用宽度相同条形的高度或长短来表示数据多少的图形,可以横置或纵置.纵置时的条形图也称为 柱形图 (column chart). 绘制条形图 1 import mat ...

  2. jsonobject json对象里面_「jsonobject」用JSONObject解析和处理json数据 - seo实验室

    jsonobject 本文中主要介绍jsonobject处理json数据时候的一些常用场景和方法. (一)jar包下载 所需jar包打包下载百度网盘地址:https://pan.baidu.com/s ...

  3. Python文字转换语音,让你的文字会「说话」,抠脚大汉秒变撒娇萌妹

    APP 也有文字转换为语音的功能,虽然听起来很别扭,但是基本能解决长辈们看不清文字或者眼睛疲劳,通过文字转换为语音来获取信息. 我们用 Python 能否实现文字转语音呢,可以的,百度有个语音接口,可 ...

  4. Python学习——02-Python基础——【9-面向对象进阶】——isinstance(obj,cls)、反射等...

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(objec ...

  5. 使用Python,OpenCV转换颜色空间,追踪对象的轨迹

    使用Python,OpenCV转换颜色空间,追踪对象的轨迹 1. 效果图 2. 源码 参考 这篇博客可以看作是之前俩篇博客的融合,将介绍如何使用Python,OpenCV转换颜色空间,并利用HSV追踪 ...

  6. 使用Python,OpenCV检测摄像机到标记对象的距离

    使用Python,OpenCV检测摄像机到标记对象的距离 1. 效果图 2. 三角形相似性是什么? 3. 三角形相似性检测距离原理 4. 使用Python,OpenCV检测标记对象 5. 源码 参考 ...

  7. 如何在python中找到两个日期时间对象之间的时差?

    本文翻译自:How do I find the time difference between two datetime objects in python? 如何分辨两个datetime对象之间的时 ...

  8. Python学习教程(Python学习路线):Day08-面向对象编程基础

    Python学习教程(Python学习路线):面向对象编程基础 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程&qu ...

  9. python中的is判断引用的对象是否一致,==判断值是否相等

    python中的is判断引用的对象是否一致,==判断值是否相等 a = 10 b = 20 list = [1,2,3,4,5] print(a in list) print(b not in lis ...

最新文章

  1. 学python培训到底能干嘛
  2. freemarker if判断
  3. Python 实现感知器模型、两层神经网络
  4. element elcolumn 使用本地图片_年末了,教你如何使用Python实现上班摸鱼
  5. SAP Spartacus Ngrx 使用的一些准则
  6. 超好用的27个谷歌Chrome浏览器使用技巧
  7. Xshell登录Linux服务器 提示WARNING! The remote SSH server rejected X11 forwarding request 及 提示符显示-bash-4.2#
  8. 7-11 数列求和-加强版 (20 分)
  9. matplotlib动态图和视频保存
  10. [Java] 蓝桥杯ALGO-93 算法训练 反置数
  11. NGSL + NAWL 单词表 以及学习网站
  12. Linux多线程编程入门
  13. pcb边框是自己画_说一下Altium Designer软件画不规则PCB板边框的方法
  14. .net dll反编译出现的问题,以及部分修复的方法
  15. 《吴忠与富平》之四:汉三水属国(北地属国、安定属国)
  16. Android Studio中Intent的一些相关知识
  17. 用iframe的方式 解决 window.open() 不能打开多个窗口的问题
  18. EAX、ECX、EDX、EBX、ESI、EDI、ESP、EBP寄存器
  19. 《快学Scala》第二章练习题答案+概述
  20. HCNA之华为ensp基本操作总结

热门文章

  1. python 百度词典_python在线抓取百度词典的翻译结果翻译单词
  2. 模拟手机浏览器_干货系列,让浏览器自己动起来,解放双手
  3. java如何写线程外部类_廖雪峰Java读书笔记(六)--多线程(或称并发)
  4. java设计模式adapter_Java设计模式--适配器(Adapter)模式
  5. a7100换电池_动动手你也行 篇十四:冲动是魔鬼——单反电池换芯失败记
  6. 比较全面的MySQL优化参考
  7. cmd命令安装composer踩坑
  8. mysql-5.6.16-win32_mysql-5.6.16-win32免安装配置方法
  9. camunda流程定义表无数据_BPM - 业务流程管理
  10. keras 多层lstm_《Keras 实现 LSTM》笔记