不带变量赋值的Python类实例

不带变量赋值的Python类实例,python,class,memory,Python,Class,Memory,如果我创建一个类的实例而不将其分配给变量,那么每次运行代码时它会占用内存吗?或者,在执行包含实例的代码行后,内存是否会释放 例如: class TestClass(): def __init__(self): self.Moto = "Moto" def printIt(self): print self.Moto 因此,如果我这样使用它: TestClass().printIt() 每次执行该行时,它是否占用越来越多的内存 否,实例将被自动垃

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

例如:

class TestClass():
    def __init__(self):
        self.Moto = "Moto"
    def printIt(self):
        print self.Moto
因此,如果我这样使用它:

TestClass().printIt()

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

否,实例将被自动垃圾收集。确切的机制取决于Python实现。CPython使用引用计数,并将在
TestClass()的末尾释放实例。printIt()


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

否,该对象将立即被垃圾回收,即使垃圾回收器“启动”并实际释放该对象时,该对象取决于实现

如果我们查看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)
\u Py\u 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_dealoc
插槽

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


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

您真的必须这样做吗?
printIt
不应该是一个静态方法吗?是的,jython完全依赖于Java GC。而且(您可能还提到)如果对象直接或间接地持有对自身的引用,那么它最终将被垃圾收集,但即使在CPython中,它也不会立即被清理。