没有变量赋值的Python类实例

时间:2012-11-26 14:04:56

标签: python class memory

如果我创建一个类的实例而不将其分配给变量,那么每次运行代码时它都会占用内存吗?或者在执行包含实例的代码行之后内存是否释放?

例如:

class TestClass():
    def __init__(self):
        self.Moto = "Moto"
    def printIt(self):
        print self.Moto

所以,如果我像这样使用它:

TestClass().printIt()

每次执行该行时是否占用越来越多的内存?

2 个答案:

答案 0 :(得分:4)

不,实例将自动进行垃圾回收。确切的机制取决于Python的实现。 CPython使用引用计数,并在TestClass().printIt()结束时释放实例。

但是,如果要保留对新构造的对象的一个​​或多个引用,则只要引用该对象,该对象就会保持活动状态。

答案 1 :(得分:2)

不,该对象将立即被垃圾收集,即使垃圾收集器“开始”并且实际上释放该对象是依赖于实现的。

如果我们查看CPython源代码,我们可以看到该对象立即被释放:

/* Include/object.h */
#define Py_DECREF(op)                                   \
    do {                                                \
        if (_Py_DEC_REFTOTAL  _Py_REF_DEBUG_COMMA       \
        --((PyObject*)(op))->ob_refcnt != 0)            \
            _Py_CHECK_REFCNT(op)                        \
        else                                            \
        _Py_Dealloc((PyObject *)(op));                  \
    } while (0)

_Py_Dealloc定义为:

#define _Py_Dealloc(op) (                               \
    _Py_INC_TPFREES(op) _Py_COUNT_ALLOCS_COMMA          \
    (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op)))
#endif /* !Py_TRACE_REFS */

因此,您可以看到tp_dealloc插槽,它负责释放内存。直接调用。

其他实现,如PyPy,IronPython或Jython可能无法立即释放内存,这可能会导致 termporary 增加内存使用量。

特别是我相信Jython一切都取决于Java垃圾收集器,它不能保证尽快释放内存。甚至调用System.gc()仅仅是垃圾收集器的建议,但它不会强制它释放内存。