目录
0.Python引用机制
Python的引用机制是动态类型,对象是存储在内存加中的实体
我们在程序中写的对象名,只是指向这一对象的引用
引用和对象分离,是动态类型的核心
引用可以随时指向一个新的对象(内存地址会不一样)
1.Python引用计数
定义:
在Python中,每个对象都有存有指向该对象的引用总数,即引用计数
原理:
每个对象维护一个ob_ref字段,用来记录该对象当前被引用的次数
每当有新的引用指向该对象时,他的引用计数+1
每当该对象的引用失效时,引用计数-1
引用计数为0时,该对象将被回收释放
#需要额外的空间维护引用计数,并且不能解决对象的“循环引用”
使用:
获取引用计数:getrefcount()
#当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用,获取的值会比期望的多1.
增加引用计数:
减少引用计数:del
循环引用的情况:
优点:
简单
实时
缺点:
维护引用计数消耗资源
2.Python垃圾回收
原则:
当Python的某个对象的引用计数降为0时,可以被垃圾回收。
gc机制:
GC作为现代编程语言的自动内存管理机制,专注于两件事
找到内存中无用的垃圾资源
触发垃圾回收的的三种情况:
调用gc.collect()
GC达到阈值时
程序退出时
分代回收generation:
Python将所有对象分为0、1、2三代
所有新建的对象都是0代对象
当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象
垃圾回收启动时,一定会扫描所有0代对象
如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理
当1代也经历了一定次数的垃圾回收,那么会启动0、1、2,即所有对象进行扫描
标记清除
3.Python缓冲池
字符串驻留区
加了特殊字符就不会放在字符区
4.深拷贝与浅拷贝
浅拷贝:
只拷贝第一层的地址
lst1 = lst2.copy()
lst1 = lst2[::]
深拷贝
import copy
b = copy.deepcopy(a)