Python 内存回收机制的疑问

2017-07-10 00:42:57 +08:00
 wisefree

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

# -*- 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()      # 这个实例在执行这个函数后,会不会被垃圾回收呢?
                 # 如果不立即回收,是不是循环多次后,内存是不是占用很大?
                 # 在循环中不断构造实例,是不是合理的?
2636 次点击
所在节点    Python
6 条回复
BarrelTitor
2017-07-10 00:59:06 +08:00
在 A 中加个__del__方法,print 一下应该就可以看到了。
我 mac 上 3.6 是立刻删除的。
est
2017-07-10 01:09:33 +08:00
a 不会回收但是第二个循环重新赋值之后就回收了
wwqgtxx
2017-07-10 01:43:06 +08:00
@BarrelTitor 不过平时最好不要加__del__方法,否则在两个类有循环引用的情况下会无法垃圾回收
wisefree
2017-07-10 09:27:00 +08:00
@BarrelTitor 这种在循环不断构造实例,合理就行,以前都是构造几个类就 OK 了,突然放在循环里有点不适应
wisefree
2017-07-10 09:27:18 +08:00
@est ok,谢谢啦
ToBeHacker
2017-07-10 10:08:58 +08:00
Python 主要通过引用计数清理垃圾,在二次循环后 a 被重新复制,原先的引用减为 0 后就会被立即清理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/374153

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX