In [1]: class T(object):
...: pass
...:
In [2]: x = T()
In [3]: print(x)
<__main__.T object at 0x03328E10>
In [4]: x = T()
In [5]: print(x)
<__main__.T object at 0x03345090>
何时释放分配给第一个T()
对象(0x03328E10)的内存位置?是在覆盖变量x
时还是在运行垃圾收集器或脚本结束时?
我在垃圾收集器运行时假设它,但我不知道如何测试这个假设。
答案 0 :(得分:3)
Python内存管理大部分是通过引用计数完成的,而不是垃圾收集。当引用计数变为零时,内存可用于重新分配。
垃圾收集器只有在你有循环引用时才会起作用,这不是这里的情况。
答案 1 :(得分:1)
首先,它取决于您使用的Python实现。 CPython,参考实现,确实引用计数,这意味着你的假设是正确的。您可以通过实施__del__
方法来测试该假设。
然而,避免这是一种不好的做法。例如,PyPy,IronPython和Jython会进行垃圾回收,因此无法保证您的假设。
那么如何在Python中实现资源定型?请改用context managers。上下文管理器是RAII Python提供的功能。