python内存管理
一、对象引用
1.对象引用
a=257 单独开辟一块内存,存储257,a指向257
b=257 同上
a与b指向的内存地址不一致
假如c=a,那么c引用变量a,也指向257,不会重新开辟内存;只有赋值时,才会开辟一块内存;
2.内置函数is和id
ipython环境中:id(变量)查看引用对象
a='123',b='123' a is b ---->True
a=257,b=257 a is b--->False
3.数据的可变性
可变数据类型,定义之后内存地址不变,可修改内存中的数据,如:list、dict、set
不可变数据类型,要修改内存中的数据,内存地址会发生变化,如:数值类型(int\float\double等)、字符串、元组
二、小整数池和intern机制
小整数池:针对数值
-5至256是提前创建好,放在小整数池中;
若a=-5,b=-5,均指向小整数池中的数据,引用对象一致
intern机制也称大整数池:针对字符串,只存储包含标准字符(数字、字母、下划线)的字符串
定义一个字符串会被放到大整数池中,定义一个新字符串时,会先来整数池找,如果有直接引用,没有就会创建一个
三、深浅拷贝(列表嵌套列表时讨论,并发用到)
浅拷贝理解:获得对象的引用,引用的内容发生变化,同步发生变化,如:list3引用li
使用copy()方法实现;
eg:list3=list1.copy()
li=[1,2,3]
list1=[11,22,li] list2=list1 list3=list1.copy()
list1.append(33)
list2=list1=[11,22,[1,2,3],33]
list3=[11,22,[1,2,3]]
li=[1,2,3,4]
list2=list1=[11,22,[1,2,3,4],33]
list3=[11,22,[1,2,3,4]]
深拷贝:深度复制,将引用的内容也复制出来,引用内容发生变化,不会发生变化,复制的是引用的值;
使用copy.deepcopy()方法实现;
eg:list4=copy.deepcopy(list1)
import copy list4=copy.deepcopy(list1)
li.remove(4)
list1.remove(33)
list1=[11,22,[1,2,3]]
list3=[11,22,[1,2,3]]
list4=[11,22,[1,2,3,4]]
四、垃圾回收和GC模块
1.垃圾回收机制:使用引用计数机制为主,标记清除和分代回收为辅进行
引用计数: 对象被创建后,变量每引用一次,计数+1,计数为0时,被释放
计数机制存在缺点,如:循环引用,永远删除不了
标记清除:外部没有变量引用,即被删除,解决循环引用无法删除的问题
分代回收:实现引用计数扫描频次
1.第一代链表中对象数量超过700个,分代回收机制触发检测查看计数为0,对其进行清除,如此循环清除10次之后,非0的放到第二代链表中,如此循环清除10次之 后放到第三代链表中,第三代链表自动开始清除回收;最高三代
import gc gc.get_threshold()--------(700,10,10)
2.GC模块:可手动删除循环引用

浙公网安备 33010602011771号