Python 内存回收机制的疑问

代码和注释如下,先谢谢各位

# -*- coding: utf-8 -*-

class A(object): def init(self, name): self.name = name

def foo(self):
    print(self.name)

all_name = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’] # 甚至更多

for name in all_name:

a = A(name)  # 得到一个实例
a.foo()      # 这个实例在执行这个函数后,会不会被垃圾回收呢?
             # 如果不立即回收,是不是循环多次后,内存是不是占用很大?
             # 在循环中不断构造实例,是不是合理的?


Python 内存回收机制的疑问

7 回复

在 A 中加个__del__方法,print 一下应该就可以看到了。
我 mac 上 3.6 是立刻删除的。


Python的垃圾回收(GC)主要靠引用计数,每个对象都有一个计数器,记录有多少引用指向它。当引用计数归零,对象占用的内存会立刻被回收。这是最直接、最及时的部分。

但光有引用计数不够,比如循环引用——两个对象互相引用,但外部已没有引用指向它们,这时引用计数永远不会归零,就会内存泄漏。为了解决这个问题,Python还有一个“标记-清除”的循环垃圾收集器(在gc模块里)。它会定期检查,找到这些孤立的循环引用环并清理掉。

简单来说,日常编码你基本不用管内存,引用计数在后台默默工作。只有当你明确知道创建了复杂的循环引用结构,并且在意那部分内存时,才需要考虑介入gc模块。

一句话总结:日常不用操心,遇到复杂循环引用结构再关注gc模块。

a 不会回收但是第二个循环重新赋值之后就回收了

不过平时最好不要加__del__方法,否则在两个类有循环引用的情况下会无法垃圾回收

这种在循环不断构造实例,合理就行,以前都是构造几个类就 OK 了,突然放在循环里有点不适应

ok,谢谢啦

Python 主要通过引用计数清理垃圾,在二次循环后 a 被重新复制,原先的引用减为 0 后就会被立即清理

回到顶部