Python中的垃圾收集如何与类方法一起使用?

Dav*_*idM 3 python garbage-collection

class example:

    def exampleMethod(self):
        aVar = 'some string'
        return aVar
Run Code Online (Sandbox Code Playgroud)

在这个例子中,每次调用example.exampleMethod()后垃圾收集如何工作?一旦方法返回,aVar会被释放吗?

S.L*_*ott 6

变量永远不会被释放.

对象(在这种情况下是一个字符串,其值'some string'一次又一次地重复使用,因此永远不能释放该对象.

当没有变量引用对象时,对象将被释放.想一想.

a = 'hi mom'
a = 'next value'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,'hi mom'执行第二个语句时,第一个对象(具有值的字符串)不再在脚本中的任何位置引用.object('hi mom')可以从内存中删除.


Paw*_*icz 5

每次将对象分配给变量时,都会增加该对象的引用计数器。

a = MyObject() # +1, so it's at 1
b = a # +1, so it's now 2
a = 'something else' # -1, so it's 1
b = 'something else' # -1, so it's 0
Run Code Online (Sandbox Code Playgroud)

没有人可以访问我们在第一行创建的 MyObject 对象了。

当计数器达到零时,垃圾收集器释放内存。

有一种方法可以创建一个不增加引用计数器的棘手引用(如果您不希望一个对象仅仅因为它在某些缓存字典中而保留在内存中,则可以这样做)。

有关 cPython 引用计数的更多信息可以在此处找到。

Python 是一种语言,cPython 是它的(相当流行的)实现。据我所知,语言本身没有指定如何释放内存。