首页 > 编程语言 >python垃圾回收机制(十分重要)

python垃圾回收机制(十分重要)

时间:2024-10-27 09:59:08浏览次数:5  
标签:python 回收 对象 del 垃圾 pt3 pt2 pt1 引用

python垃圾回收机制

总概

python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略,在 Python 内部记录着所有使用中的对象各有多少引用。

​ 在C/C++中采用用户自己管理维护内存的方式。自己管理内存极其自由,可以任意申请内存,但也为大量内存泄露、悬空指针等bug埋下隐患。

​ 如何知道一个对象永远都不能再使用了呢?很简单,就是当这个对象的引用计数值为 0 时,说明这个对象永不再用,自然它就变成了垃圾,需要被回收。

计数表

a = 40      # 创建对象  <40>
b = a       # 增加引用, <40> 的计数
c = [b]     # 增加引用.  <40> 的计数

del a       # 减少引用 <40> 的计数
b = 100     # 减少引用 <40> 的计数
c[0] = -1   # 减少引用 <40> 的计数

示例

class Point:
   def __init__( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__
      print class_name, "销毁"
 
pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # 打印对象的id
del pt1
del pt2
del pt3

结果

3083401324 3083401324 3083401324
Point 销毁

示例执行过程

执行过程:

1.创建Point对象:
   pt1 = Point():创建了一个Point对象,其x和y属性默认都是0。pt1是这个对象的第一个引用。
2.复制引用:
   pt2 = pt1:pt2现在指向pt1所指向的同一个对象。
   pt3 = pt1:同样,pt3也指向pt1所指向的同一个对象。
3.打印对象的id:
   print id(pt1), id(pt2), id(pt3):由于pt1、pt2和pt3都指向同一个对象,所以它们打印出的id是相同的。
4.删除引用:
   del pt1:删除了pt1这个引用,但对象本身仍然存在,因为还有pt2和pt3指向它。
   del pt2:同样,删除了pt2这个引用,但对象仍然因为pt3的引用而存在。
   del pt3:最后,删除了pt3这个引用。此时,没有任何引用指向这个Point对象,Python的垃圾回收机制会识别到这个对象不再被使用,并销毁它。
5.析构方法:
   当Point对象被销毁时,它的析构方法__del__会被调用。因此,在del pt3之后,会打印出"Point 销毁"。

此外

​ 析构方法的调用时机是由Python的垃圾回收机制决定的,它可能在对象不再被引用后的某个不确定的时间点被调用。此外,对于简单的对象,析构方法通常不是必需的,因为Python的内存管理已经足够高效。析构方法主要用于释放非内存资源,如文件句柄、网络连接等。

标签:python,回收,对象,del,垃圾,pt3,pt2,pt1,引用
From: https://www.cnblogs.com/guixiangyyds/p/18507907

相关文章

  • (开题)flask框架校园二手物品交易网站(程序+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今社会,随着物质生活的丰富和消费观念的转变,校园内二手物品的交换和转让变得越来越频繁。然而,传统的二手物品交易方式往往依赖于口口相......
  • (开题)flask框架校园共享单车管理系统(程序+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着绿色出行理念的深入人心和共享经济的蓬勃发展,校园共享单车已成为许多高校内不可或缺的交通工具。它不仅方便了学生的日常出行,减少了校......
  • 面试 | 针对有经验的20个高频Python面试问题·进阶篇
    1.什么是字典和列表推导?Python推导式与装饰器一样,是语法糖结构,可帮助从给定的列表、字典或集合构建经过修改和过滤的列表、字典或集合。使用推导式可节省大量时间和代码,这些代码可能会更加冗长(包含更多代码行)。对整个列表执行数学运算my_list=[2,3,5,7,11]squared_......
  • 大数据技术045_python国潮男装微博评论数据分析系统的设计与实现 django flask爬虫可
    目录具体实现截图技术栈预期达到的目标开发技术介绍论文大纲目录编码规范核心代码部分展示其他项目推荐详细视频演示源码获取方式具体实现截图技术栈Python也提供了数据库的操作接口,通过引入Python的MySQL处理对象连接数据库后,使用通用的SQL语句方法实现数......
  • 100种算法【Python版】第13篇——埃拉托斯特尼素数筛法
    本文目录1基本原理2算法步骤2.1初始化:2.2标记非素数:2.3收集素数:3数学示例4python代码1基本原理埃拉托斯特尼筛法(SieveofEratosthenes)是一种经典的算法,用于高效地寻找一定范围内的所有素数。该算法以古希腊数学家埃拉托斯特尼命名,具有简单易懂......
  • 第一个Python程序
    编写“Hello,World!”程序*“Hello,World!”*是编程的经典入门程序。通过这个简单的程序,可以了解Python代码的基本写法以及如何执行。打开代码编辑器(例如IDLE或VSCode):你可以使用任何文本编辑器,但推荐使用Python自带的IDLE或VSCode,因为它们提供了语法高亮和代码提示功能......
  • stamina 生产级的python 重试包
    stamina是基于tenacity的包装包含的特性仅对某些异常(甚至是其中的子集)进行重试,方法是先使用谓词进行自检重试之间带有抖动的指数退避限制重试次数和总时间自动异步支持-包括Trio保留所装饰的可调用函数的类型提示开箱即用,可灵活使用Prometheus、structlog和标准库的支持l......
  • 【Python入门】7天速成Python网络爬虫高手,Autoscraper从零基础到实战只需一篇
    ......
  • 累计行为 | Python
    累计,就是不断计算增加的数据。累计行为如此普遍以至于在编程过程中往往我们使用到了而不自知。当循环体出现在程序中往往累计行为就开始了。最近我经常需要把Python作为一个计算器来验算一些数学题,由此总结了些Python中累计行为的实现方法1.reduce这是functools标准库里......
  • 基于卷积神经⽹络(CNN)实现垃圾分类Matlab
    源码⼀、垃圾分类如何通过垃圾分类管理,最⼤限度地实现垃圾资源利⽤,减少垃圾处置量,改善⽣存环境质量,是当前世界各国共同关注的迫切问题之⼀。根据国家制定的统⼀标准,现在⽣活垃圾被⼴泛分为四类,分别是可回收物、餐厨垃圾、有害垃圾和其他垃圾。可回收物表⽰适宜回收和资源利⽤......