Python之异常处理、垃圾回收机制

本文详细介绍了Python中的异常处理方法,包括try-except语句的使用,以及如何触发和自定义异常。同时,深入探讨了Python的垃圾回收机制,包括引用计数、标记-清除和分代收集三种策略,以及小整数对象池和字符串驻留机制等优化手段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、异常处理:

  1. 什么是异常?
    异常是在影响程序正常执行过程的一个事件。如果不捕获处理,将会导致程序终止执行。

  2. 常见异常:
    1).当分母为0时,出现错误
    在这里插入图片描述2).当变量未被定义就使用时的报错
    在这里插入图片描述3).不同类型进行运算时的报错
    在这里插入图片描述
    4).索引异常:
    在这里插入图片描述5).字典Key值错误:KeyError
    在这里插入图片描述缩进异常:
    在这里插入图片描述

  3. 异常处理
    try:
    try里面写的是要执行的代码:
    当try中出现报错语句时,该错误语句以下的程序都不会打印
    except NameError:
    try里的代码异常才会执行的代码;
    该命令只对NameError错误进行处理
    else:
    判断是否有异常, 如果没有, 执行此代码
    finally:
    有异常和没有异常都会执行的代码;

  4. 触发异常
    使用raise语句自己触发异常:
    格式: raise[Exception[,args[,traceback]]]
    语句中 Exception 是异常的类型,参数标准异常中任一种;
    args 是自已提供的异常参数。

  5. 用户自定义异常:

class AgeException(Exception):
  	pass

“pass是指代码不执行任何语句,但是不为空”
在这里插入图片描述二、垃圾回收机制:

  1. 对象池
    1).小整数对象池
    范围:[-5,257)
    在一个Python的程序中,所有位于这个范围内的整数使用的都是同一个对象.
    小整数池的作用之一为避免因为整数的频繁申请和销毁内存空间。
    2).大整数对象池
    每个大整数都会创建一个新的对象
    3).字符串驻留机制,intern机制
    通过维护一个字符串常量池,从而试图只保存唯一的字符串对象,达到既高效又在处理字符串时节省了内存。
    在创建一个新的字符串对象后,Python 先比较常量池中是否有相同的对象(interned),有的话则将指针指向已有对象,并减少新对象的指针,新对象由于没有引用计数,就会被垃圾回收机制回收掉,释放出内存。
    字符串含有空格,不可修改,还有,本机制使用前需要启用,共用对象不生效,引用为0的情况下,就会被销毁。
    python采用的是"引用计数机制"为主,"标记-清除"和"分代收集"两种机制为辅的策略

  2. 引用计数机制
    GC 原本是一种“释放怎么都无法被引用的对象的机制”,可以让所有对象事先记录下“有多少程序引用自己”。让各对象知道自己的“人气指数”,从而让没有人气的对象自己消失,这就是引用计数法(Reference Counting).

导致引用计数加1的情况
1). 对象被创建 a=1, +1
2). 对象被引用:+1
a=1
b=a
3).对象作为参数参与函数,fun(a)
4).对象作为一个元素,存储在容器中,例如list1=[a,a]

导致引用计数-1的情况:
1). 对象的别名被显式销毁,例如del a
2). 对象的别名被赋予新的对象,例如a=24
3). 一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
4). 对象所在的容器被销毁,或从容器中删除对象
好处:
不引用便可以释放所占内存且简单
坏处:
维护引用计数消耗资源
循环引用

  1. 标记-清除
    GC 标记 - 清除算法由标记阶段和清除阶段构成。标记阶段是把所有活动对象都做上标记的阶段。清除阶段是把那些没有标记的对象,也就是非活动对象回收的阶段。通过这两个阶段,就可以令不能利用的内存空间重新得到利用。
    如果被标记的对象时存活的,剩下的未标记的对象为垃圾
    清除这些无用的垃圾对象,把它们送回到可用列表

  2. 分代收集
    按照不同的版本和代来先将手机易变成垃圾的对象,提高回收垃圾的效率。我们把刚生成的对象称为新生代对象,到达一定年龄的对象则称为老年代对象。
    新生代 GC 将存活了一定次数的新生代对象当作老年代对象来处理。我们把类似于这样的新生代对象上升为老年代对象的情况称为晋升(promotion)
    老年代对象很难成为垃圾,所以我们对老年代对象减少执行 GC 的频率, 从而提高效率。

  3. gc模块
    该模块提供垃圾回收的接口,包括禁用gc,调整回收频率,配置debug选项,同时提供对无法释放内存对象的访问权。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值