python的类怎么释放_如何释放Python占用的内存?

这里我聊聊python中的垃圾收集机制。想系统的了解这个问题我们需要涉及引用机制、动态类型和共享引用这些基本概念。

先谈谈python中的对象引用机制和动态类型。的确,python使用变量的时候都没有声明变量的类型,这一点和C语言不同。但是,变量还可以工作,因为在python中类型是在运行的过程中自动决定的,而不是通过代码声明的,这意味着没有必要事先声明变量。

在python中,我们要明确一个概念:变量名和对象是划分开的,变量名永远没有任何关联的类型信息,类型是和对象关联的,而不存在于变量名中。一个变量名当第一次被赋值的时候被创建,而当新的赋值表达式出现时,他会马上被当前新引用的对象所代替。这就是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相连接。

这种从变量到对象的连接,我们称之为引用,以内存中的指针形式实现。因此直白的说,在内部,变量事实上是到对象内存空间的一个指针,而且指向的对象可以随着程序赋值语句而不断变化。

总结一下:变量名没有类型,只有对象才有类型,变量只是引用了不同类型的对象而已。每一个对象都包含了两个头部信息,一个是类型标志符,标识这个对象的类型,以及一个引用的计数器,用来表示这个对象被多少个变量名所引用,如果此时没有变量引用他,那么就可以回收这个对象。

基于上面谈到的引用机制,我们再说说Python的垃圾收集机制

还是上面那个例子,每当一个变量名被赋予了一个新的对象,那么之前的那个对象占用的空间就会被回收,前提是如果他没有被其他变量名或者对象引用。这种自动回收对象空间的机制叫做垃圾收集机制。

即当a被赋值给列表对象[1,2,3,4,5]时,字符串对象的内存空间就被自动回收(如果他没有被别的变量引用)

具体的内部机制是这样的:python在每个对象中保存了一个计数器,计数器记录了当前指向该对象的引用的数目。一旦这个计数器被设置为0,这个对象的内存空间就会自动回收。当a被赋值给列表对象后,原来的字符串对象‘abcde’的引用计数器就会变为0,导致他的空间被回收。这就使得我们不必像C++那样需要专门编写释放内存空间的代码了

最后再说说共享引用的内容吧:

如下所示,多个变量名引用了同一个对象,称为共享引用:

a = 'abcde'

b = a

print(a)

print(b)

abcde

abcde

此时字符串对象’abcde’的引用计数是2,我们进一步往下看如果我们此时对变量a重新赋值呢?

a = 'abcde'

b = a

a = [1,2,3,4]

print(a)

print(b)

[1, 2, 3, 4]

Abcde

结果是显而易见的,变量a变成了列表对象的引用,而变量b依然是字符串对象’abcde’的引用,并且字符串对象的引用计数为由2变为1.

如果此时再对b进行重新赋值,字符串对象’abcde’的引用计数就会变为0,然后这个对象就被垃圾回收了。

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

更系统、更深入的探讨欢迎进入我们的专栏《Python数据科学之路》:酱油哥:来吧,一起踏上Python数据科学之路​zhuanlan.zhihu.comv2-d6447864fbc755396dbd5f78e0a85fd6_180x120.jpg

本专栏仿照美剧的剧集编排方式和整体逻辑架构进行组织,目前策划共分为七季:

第一季:Python编程语言核心基础。

第二季:Python数据分析基本工具。

第三季:机器学习线性代数核心-Python描述。

第四季:利用python进行时间序列分析。

第五季:机器学习概率统计核心-Python描述。

第六季:机器学习典型算法专题。

第七季:实战热点深度应用。

让我们一步一个台阶,共同踏上Python数据科学之旅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值