python的垃圾回收机制

python的垃圾回收机制

前段时间被大佬问道python的垃圾回收机制,比如python创建了一个对象以后,当这个对象不用时,怎么把这个对象的内存释放了,开始的时候一头雾水,确实没想过这个问题,问了度娘以后,知道了个大概,顺便记下来,省的以后忘了。

在python中,变量名和对象是划分开的,变量名永远没有任何关联的类型信息,类型是和对象关联的,而不存在于变量名中。一个变量名当第一次被赋值的时候被创建,而当新的赋值表达式出现时,他会马上被当前新引用的对象所代替。可以用sys库中的getrefcount()方法查询某一个对象被引用的次数,这就是python所谓的动态类型机制。具体看一个例子:

a = 'abcde'
print(a)
a = [1,2,3,4,5]
print(a)

abcde
[1, 2, 3, 4, 5]

结合上面这个例子,我们再来从头仔细理一理:1、创建了一个字符串对象’abcde’,然后创建了一个变量a,将变量a和字符串对象’abcde’相连接,2、之后又创建了一个列表对象[1,2,3,4,5],然后又将他和a相连接。这种从变量到对象的连接,我们称之为引用,以内存中的指针形式实现。因此直白的说,在内部,变量事实上是到对象内存空间的一个指针,而且指向的对象可以随着程序赋值语句而不断变化。总结一下:变量名没有类型,只有对象才有类型,变量只是引用了不同类型的对象而已。每一个对象都包含了两个头部信息,一个是类型标志符,标识这个对象的类型,以及一个引用的计数器,用来表示这个对象被多少个变量名所引用,如果此时没有变量引用他,那么就可以回收这个对象。

还是上面那个例子,每当一个变量名被赋予了一个新的对象,那么之前的那个对象占用的空间就会被回收,前提是如果他没有被其他变量名或者对象引用。这种自动回收对象空间的机制叫做垃圾收集机制。即当a被赋值给列表对象[1,2,3,4,5]时,字符串对象的内存空间就被自动回收(如果他没有被别的变量引用)
具体的内部机制是这样的:python在每个对象中保存了一个计数器,计数器记录了当前指向该对象的引用的数目。一旦这个计数器被设置为0,这个对象的内存空间就会自动回收。当a被赋值给列表对象后,原来的字符串对象‘abcde’的引用计数器就会变为0,导致他的空间被回收。

总结一下,给一个变量赋一个新的值,并不是替换原始的对象,而是让这个变量去引用完全不同的另一个对象,而原来的对象的引用计数会随之减1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值