Python中的引用计数是一种自动管理内存的方法,它可以避免程序运行过程中出现内存泄漏或溢出的问题。Python的引用计数原理非常简单,每一个对象都包含了两个头部信息,一个是类型标志符,标识这个对象的类型;另一个是计数器,记录当前指向该对象的引用数目,表示这个对象被多少个变量名所引用。CPython使用引用计数来管理内存,所有Pythonn脚本中创建的实例,都会有一个引用计数,来记录有多少个指针指向它。当引用计数只有0时,则会自动释放内存。
在Python中通过sys.getrefcount()查看引用计数的方法,注意调用getrefcount()函数会临时增加一次引用计数,得到的结果比预期的多一次。例如:
import sys
a = []
b = a
print(sys.getrefcount(a))
print(sys.getrefcount(b))
输出:
2
2
从输出可以看出,a和b都有两次引用(一次来自a,一次来自sys.getrefcount()),所以总共有四次引用。
当一个变量离开了作用域时,例如函数执行完成时或者del语句删除时,它对应的对象的引用计数会减少。如果在函数内打印,则能看到引用计数增加或减少。例如:
def func(str):
print(sys.getrefcount(str))
func('A')
func('B')
输出:
78
79
从输出可以看出,在func(‘A’)之后,在func(‘B’)之前,str对象的引用计数分别增加了1和1。
当一个变量被从容器对象中移除时(例如del语句删除),它对应的容器对象也会失去对该变量的引用,并且自身也会减少一个元素。例如:
c = [1, a, 'abc']
del c[0]
print(sys.getrefcount(a))
输出:
2
从输出可以看出,在删除c[0]之后,在打印a之前,a对象仍然被c容器所引用,并且c容器仍然有三个元素。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved