引用计数理解

引用计数

  PyObject

    1. python里每一个东西都是对象,它们的核心就是一个结构体:PyObject
    2. PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少
  •  

    >>> a = 123
    >>> sys.getrefcount(a)
    3   
    # 这里123这个对象并没有在内存中新建,因为在Python启动解释器的时候会创建一个小整数池,-5~256之间的这些对象会被自动创建加载到内存中等待调用;a = 23是为23这个整数对象增加了一个引用
    >>> b = a   # 每调用一次就会+1
    >>> sys.getrefcount(a)
    4
    >>> c = a
    >>> sys.getrefcount(a)
    5
    >>> del c   # 删除了变量就会减少一次计数
    >>> sys.getrefcount(a)
    4
    ​
    # 可以自己创建一个对象,因为是一个全新的对象,所以引用计数是0
    >>> class A:
    ...     pass
    ...
    # 此上,如果A被创建后没有任何引用则计数为0
    >>> import sys
    >>> sys.getrefcount(A())    # 因为getrefcount也算作是一次调用,所以计数是1
    1
    

      

  • 引用计数的缺点
    • 维护引用计数消耗资源,会造成循环引用导致无法回收,造成内存泄露
      • 循环应用
      • L = []
        L2 = []
        L1.append(L2)
        L2.append(L1)

        

    • list1与list2相互引用,如果不存在其他对象对它们的引用,list1与list2的引用计数也仍然为1,所占用的内存永远无法被回收,这将是致命的。
posted @ 2018-10-25 21:21  浩小白  Views(302)  Comments(0Edit  收藏  举报