Python 声明性_基的子类不能被垃圾收集?

Python 声明性_基的子类不能被垃圾收集?,python,sqlalchemy,Python,Sqlalchemy,我正在学习sqlalchemy,并希望在我的项目中使用它。因为我的项目涉及一个树结构和许多节点,所以我希望在对象持久化到数据库中之后释放内存 但是当我为此做了一些sqlalchemy测试时,它只是让我困惑,创建的对象不会被垃圾收集 以下是我的测试代码: from sqlalchemy import (create_engine, Column, select, case, func, ForeignKey) from sqlalchemy import Integer, String, Bool

我正在学习sqlalchemy,并希望在我的项目中使用它。因为我的项目涉及一个树结构和许多节点,所以我希望在对象持久化到数据库中之后释放内存

但是当我为此做了一些sqlalchemy测试时,它只是让我困惑,创建的对象不会被垃圾收集

以下是我的测试代码:

from sqlalchemy import (create_engine, Column, select, case,
func, ForeignKey)
from sqlalchemy import Integer, String, Boolean
from sqlalchemy.orm import sessionmaker, MapperExtension, aliased
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base
import weakref
import sys
import gc

engine = create_engine('sqlite://', echo=True)
Base = declarative_base()

class Cursor(Base):
    __tablename__ = 'cursor'

    id = Column(Integer, primary_key = True)
    spelling = Column(String, nullable = True)
    displayname = Column(String, nullable = False)
    usr = Column(String, nullable = True)
    is_definition = Column(Boolean, nullable = False)

    type_id = Column(Integer, ForeignKey('type.id'))
    type = relationship('Type',
                        backref = backref('instances', order_by = id))


class Type(Base):
    __tablename__ = 'type'

    id = Column(Integer, primary_key = True)

    is_const_qualified = Column(Boolean, nullable = False)


obj_type = Type(is_const_qualified=False)
type_ref = weakref.ref(obj_type)

print sys.getrefcount(obj_type)

obj_type = None
print type_ref()
这给了我以下输出:

3
<__main__.Type object at 0x268a490>
3
因此,在我将
obj_type
设置为None之后,它仍然不是垃圾收集的,仍然是活动的。 为什么会这样?这就是
声明性\u base
的机制吗


请注意,我使用的是Python 2.7.3和sqlalchemy 0.7.9。

这在sqlalchemy 0.8中效果更好,但是在0.7.9中,只是有一个循环。测试gc时,始终需要调用
gc.collect()
来收集周期:

obj_type = None
gc.collect()
print type_ref()

在0.8中,如果使用了cPython,则此特定测试不需要
collect()

我尝试过它,它在0.8.1中确实有效。非常感谢。所以这就是旧版本的
关系的问题了
?我不能具体地说,但总的来说,你不应该依赖于Python垃圾收集是即时的。周期一直在发生,Pypy和Jython这样的解释器执行GC的方式也完全不同。