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模块:可手动删除循环引用

posted @ 2021-10-13 23:44  Erie  阅读(92)  评论(0)    收藏  举报