【发布时间】:2016-05-14 23:21:08
【问题描述】:
我想跟踪当前正在使用的某种类型的对象。例如:跟踪一个类的所有实例或由元类创建的所有类。
这样跟踪实例很容易:
class A():
instances = []
def __init__(self):
self.instances.append(self)
但是,如果在该列表之外的任何地方都没有引用某个实例,则将不再需要该实例,并且我不想在潜在的耗时循环中处理该实例。
我尝试使用 sys.getrefcount 删除仅在列表中引用的对象。
for i in A.instances:
if sys.getrefcount(i) <=3: # in the list, in the loop and in getrefcount
# collect and remove after the loop
我遇到的问题是引用计数非常模糊。 打开一个新的 shell 并创建一个没有内容的虚拟类返回 5
sys.getrefcount(DummyClass)
另一个想法是复制对象,然后删除列表并检查哪些对象已被安排进行垃圾收集,并在最后一步删除这些对象。比如:
Copy = copy(A.instances)
del A.instances
A.instances = [i for i in Copy if not copy_of_i_is_in_GC(i)]
当引用计数变为0时,不必立即删除对象。我只是不想在不再使用的对象上浪费太多资源。
【问题讨论】:
标签: python list object reference garbage-collection