Day 5
References:
回顾
今日内容
垃圾回收机制(Garbage Collection)
列表在内存中的存储方式
PS: 看本文顶部的引用文章查看具体的概念描述
PPS: 或者看python分类中关于python reference的文章
- 引用计数
- 直接引用
- 间接引用
如下图:
PS: 详细看python分类中关于How python list works这篇文章
- 标记清除
循环引用导致内存泄漏
内存管理管理的是堆区,当堆区的内容被回收,栈区的变量没有对应关系之后自然会被清除
- 分代回收
针对引用计数扫描效率的问题,启用了分代回收机制,优化垃圾扫描频率
内存泄露
在Python中,内存泄漏是指程序在运行过程中,未能释放不再使用的内存,导致占用的内存持续增长,最终可能耗尽系统可用内存,影响程序性能或导致程序崩溃。尽管Python具有自动垃圾回收机制,但在某些特定情况下,仍可能出现内存泄漏。
Python中的内存管理
Python使用引用计数和周期检测算法来管理内存。大多数情况下,当一个对象不再被引用时,其引用计数降为零,Python的垃圾回收器会自动释放该对象占用的内存。但是,如果存在循环引用或其他特殊情况,垃圾回收器可能无法立即检测到对象不再需要,从而导致内存泄漏。
出现内存泄漏的情况
-
循环引用: 当对象之间形成循环引用,且这些对象不再被外部引用时,Python的引用计数机制可能不会释放这些对象,除非垃圾回收器运行周期性清理。在Python 3.4及更高版本中,垃圾回收器更加积极,但循环引用仍然可能成为问题。
-
全局变量: 全局变量或模块级别的变量如果持续累积数据,而没有适当的清理机制,也可能导致内存泄漏。例如,不断向全局列表添加元素而不移除旧元素。
-
C扩展模块: 如果使用C编写的扩展模块,而该模块的内存管理不当,可能会导致内存泄漏。这是因为C扩展不受Python的自动内存管理约束。
-
弱引用: 如果对象只有弱引用,且这些弱引用没有被适当地清理,也可能会导致对象不被垃圾回收。
-
长时间运行的任务: 对于长时间运行的Python服务或守护进程,即使很小的内存泄漏也可能随时间积累成大问题。
-
第三方库: 第三方库可能存在内存管理问题,特别是那些处理大量数据或使用底层API的库。
如何检测和解决内存泄漏
-
使用工具: 可以使用像objgraph、heapy、tracemalloc等工具来检测Python中的内存泄漏。
-
定期重启服务: 对于长时间运行的服务,定期重启可以作为一种临时的解决办法,但这并不是根本的解决方案。
-
代码审查: 定期进行代码审查,寻找可能导致内存泄漏的模式,如不当的引用管理和不必要的数据累积。
-
优化数据结构使用: 使用适当的数据结构和算法,避免不必要的数据复制和累积。
-
使用弱引用: 在适当的情况下使用弱引用,避免不必要的强引用导致的对象生存期过长。
-
垃圾回收调优: 虽然通常不需要,但在特定情况下,可以手动触发垃圾回收或调整垃圾回收策略。
理解内存泄漏的原因和采取预防措施对于编写高效、健壮的Python应用程序至关重要。在开发过程中,持续监控和测试程序的内存使用情况可以帮助及时发现和解决问题。
用户交互之接收用户输入
为什么python 3.0的input比python 2.0的input更好?
因为python 2.0的input要求用户输入“正确”的数据类型,但是指望所有的用户都认识python中数据类型的语法是不现实的。所以在python 3.0中,无论用户输入的是什么,都将被python解释器识别为字符串类型,至于输入的内容需要被看作什么类型,则由开发者决定
如上图。在python 2.0中,如果输错了list类型的格式,python解释器会报错
格式化输出
方式一
方式二
2.6版本引用format方法处理字符串的格式化输出,其兼容性好
方式三
基本运算符之算数运算与比较运算
基本运算符之赋值运算符
- 链式赋值
- 交叉赋值
- 解压赋值