美文网首页
Python 内存管理之 ->引用计数

Python 内存管理之 ->引用计数

作者: 酷酷的图图 | 来源:发表于2018-06-25 17:29 被阅读0次

    人生苦短 我用python

    开始愉快的享(代)受(码)时间:


    内容参考:

    引用计数增加的情况:

    • 对象被创建:

    如果对象被创建后没有引用操作,此时的引用计数是0,MyName()本身不是一个引用。

    MyName()
    
    class MyName(object):
    pass
    
    print(sys.getrefcount(MyName()))
    结果:1
    说明:之所以结果为1,是因为sys.getrefcount(MyName())函数也算一个引用。
    
    • 对象被引用

    说明:这里 23345455 这个对象并没有在内存中新建,因为在Python启动解释器的时候会创建一个小整数池 这些对象会被自动创建加载到内存中等待调用

    以下代码,赋值操作为数据增加了3个引用,sys.getrefcount(b)也增加了一个引用

    那为什么sys.getrefcount(c)的结果还是4呢?这是因为当函数执行后,作为参数的引用会自动销毁,所以print(sys.getrefcount(b))在执行完毕后引用就删除了

    # 增加了一个引用
    a = 23345455
    # 增加了一个引用
    b = a
    # 增加了一个引用
    c = b
    # 增加了一个引用
    print(sys.getrefcount(b))  # 执行完毕后引用销毁,减少一个引用
    # 增加了一个引用
    print(sys.getrefcount(c))  
    结果:4,4
    注意:每一次赋值都会增加数据操作的引用次数,要记住引用的是变量a,b,c等指向的数据23345455,而不是变量本身。
    
    • 对象被作为参数,传入到一个函数中
    print(sys.getrefcount(b))  # 执行完毕后引用销毁,减少一个引用
    
    • 对象作为一个元素,存储在容器中
    # 增加了一个引用
    a = 23345455
    # 增加了一个引用
    b = a
    list = [a, b]  # 增加了2个引用
    print(sys.getrefcount(b)
    结果:5
    

    引用计数减少的情况:

    • 对象的别名被赋予新的对象
    a = 23345455  # 增加了一个引用
    b = a  # 增加了一个引用
    print(sys.getrefcount(a))
    b = 1.4  # 减少了一个23345455整数的引用
    print(sys.getrefcount(a))
    结果:3;2
    
    • 对象别名被显示销毁

    说明:直接使用del关键字或者del()函数;注意:下述代码手动销毁的是被赋值引用的a,但是在列表里的a不会被销毁

    a = 23345455  # 增加了一个引用
    b = a  # 增加了一个引用
    list = [a, b]  # 增加了2个引用
    del a
    print(sys.getrefcount(b))
    结果:4
    
    • 一个对象离开它的作用域

    说明:a作为参数传递到sys.getrefcount(a)函数中,只在函数中起作用,一旦执行完毕就会销毁

    a = 23345455  # 增加了一个引用
    b = a  # 增加了一个引用
    print(sys.getrefcount(a))  # 执行完毕后引用销毁
    print(sys.getrefcount(a))
    结果:3;3
    
    • 对象所在的容器被销毁,或从容器中删除对象
    # 增加了一个引用
    a = 23345455
    # 增加了一个引用
    b = a
    list = [a, b]  # 增加了2个引用
    del list
    print(sys.getrefcount(b))
    结果:3
    

    相关文章

      网友评论

          本文标题:Python 内存管理之 ->引用计数

          本文链接:https://www.haomeiwen.com/subject/qigyyftx.html