内存管理
- 1. 数据的存储
内存分为栈区间和堆区间,从底层看,栈区间的内存的开辟与释放是系统自动管理的,堆区间的内存是由程序员通过代码开辟(malloc方法)和释放的
从python语言角度,栈区间的内存的开辟和释放是系统自动管理的,堆区间的内存管理也已经封装好里,程序员不需要写代码来开辟空间与释放空间
python中变量本身是存在栈区间的,函数调用过程是在栈区间
对象都是存在堆区间的(python中所有的数据都是对象)
变量赋值的过程,先在堆区间开辟空间将数据存起来,然后将数据对应的地址存到栈区间的变量中,python所有的变量都存地址
数字和字符串比较特殊,赋值的时候不会直接开辟空间,而是先检测内存缓冲区间有没有存储过这个数据,如果有就用之前的
除了数字和字符串,其他都是直接开辟新的内存空间
- 2. 内存释放(垃圾回收机制)- 掌握原理及注意 - 重点
python中的每个对象在创建的时候都有一个属性,叫引用技术,代表当前对象引用的个数。判断一个对象是否销毁就看对象的引用计数是否为0
为0的销毁,不为0的就不销毁
垃圾回收机制,不定时的查看对象的引用计数是否为0,但并不是变为0就马上销毁,因为检测是不定时的
引用计数:对象的地址被多少个变量存了
调用函数将实参传入函数, 会临时增加引用计数。因为函数会在栈区间中临时开辟一个空间来存储局部变量
getrefcount函数:
getrefcount(对象) -> 获取对象的引用计数
使用不同的变量存对象的地址会增加引用计数
要释放一个数据,改变变量的地址,或者直接del掉变量
from sys import getrefcount
list1 = [1, 2]
[1, list1] #-> 这个数据一出生就会销毁,因为没有将地址存入变量,所以引用计数为0
a = list1
print(getrefcount(list1)) # 结果为2 ----重点,obj临时存了一次地址
print(getrefcount([1.2]))