覆盖变量时,Python中的内存位置会发生什么变化?

时间:2014-04-13 16:40:54

标签: python python-3.x

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时还是在运行垃圾收集器或脚本结束时?

我在垃圾收集器运行时假设它,但我不知道如何测试这个假设。

2 个答案:

答案 0 :(得分:3)

Python内存管理大部分是通过引用计数完成的,而不是垃圾收集。当引用计数变为零时,内存可用于重新分配。

垃圾收集器只有在你有循环引用时才会起作用,这不是这里的情况。

答案 1 :(得分:1)

首先,它取决于您使用的Python实现。 CPython,参考实现,确实引用计数,这意味着你的假设是正确的。您可以通过实施__del__方法来测试该假设。

然而,避免这是一种不好的做法。例如,PyPy,IronPython和Jython会进行垃圾回收,因此无法保证您的假设。

那么如何在Python中实现资源定型?请改用context managers。上下文管理器是RAII Python提供的功能。