引用计数理解
引用计数
PyObject
- python里每一个东西都是对象,它们的核心就是一个结构体:PyObject
- 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,所占用的内存永远无法被回收,这将是致命的。