4

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

例如:

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

所以如果我这样使用它:

TestClass().printIt()

是不是每行执行一次就占用越来越多的内存?

4

2 回答 2

4

不,该实例将自动被垃圾收集。确切的机制取决于 Python 实现。CPython 使用引用计数并会在TestClass().printIt().

但是,如果您要保留对新构造对象的一个​​或多个引用,则该对象将在被引用期间一直保持活动状态。

于 2012-11-26T14:05:28.633 回答
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 可能不会立即释放内存,这可能会导致内存使用量暂时增加。

In particular I believe in Jython everything depends on the Java garbage collector, which is not guaranteed to free the memory as soon as it can. Even calling System.gc() is a mere suggestion for the garbage collector but it does not force it to free the memory.

于 2012-11-26T14:16:45.093 回答