Python 中类方法的垃圾回收是如何工作的?
class example:
def exampleMethod(self):
aVar = 'some string'
return aVar
在这个例子中,垃圾回收是怎么工作的呢?每次调用example.exampleMethod()之后,垃圾回收会发生什么?当这个方法返回时,aVar会被释放掉吗?
4 个回答
根据你的例子,如果你调用 example.exampleMethod()
但没有把结果赋值给任何变量(比如 a = example.exampleMethod()
),那么这个结果会立刻被清理掉(在CPython中),因为CPython使用的是一种引用计数的机制。用字符串作为例子并不太合适,因为字符串有一些特定的优化。字符串可以被缓存,所以不会被立刻清理,这样可以重复使用。这个特性特别有用,因为字符串在字典中作为键非常常见。
另外,垃圾回收的机制是和具体的实现有关的,所以CPython、Jython和IronPython的表现会有所不同,大部分这些信息都可以在各自的网站、手册或代码中找到。如果你想深入了解一下,我建议你创建一个类,并定义一个 del() 方法,这个方法会在对象被垃圾回收时被调用(它是一个析构函数)。你可以让它打印一些信息,这样你就能追踪到它的调用了 :)
每次你把一个对象赋值给一个变量时,这个对象的引用计数就会增加。
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
我们在第一行创建的 MyObject 对象,之后就没人能再访问它了。
当引用计数降到零的时候,垃圾回收器就会释放这块内存。
有一种方法可以创建一个特殊的引用,这种引用不会增加引用计数(比如说,如果你不想让一个对象因为在某个缓存字典里而一直占用内存)。
关于 cPython 的引用计数的更多信息可以在 这里 找到。
Python 是一种编程语言,而 cPython 是它的一种(相当流行的)实现。根据我所知,这种语言本身并没有规定内存是 如何 被释放的。
这个变量从来没有被释放。
这个对象(在这里是一个字符串,值为 'some string'
)被一次又一次地使用,所以这个对象永远无法被释放。
对象会在没有任何变量指向它的时候被释放。想想这个。
a = 'hi mom'
a = 'next value'
在这个例子中,当执行第二条语句时,第一个对象(值为 'hi mom'
的字符串)在脚本中不再被引用。这个对象('hi mom'
)可以从内存中移除。