我正在创建一个随机生成对象的程序。这些物体的寿命有限。
我创建这些对象并将它们放在一个列表中。对象跟踪它们存在的时间并最终到期。到期后不再需要它们。
我想在对象过期后将其删除,但我不确定如何引用列表中的特定对象来删除它。
if something:
list.append(SomeObject())
----后来---
我想要一个查看Object中变量的清理过程,如果它已过期,则将其从列表中删除。
提前感谢您的帮助。
答案 0 :(得分:0)
如果您将“不再使用”定义为“没有其他对象保留引用”,则可以使用refCount。这是一种好方法,因为不存在引用,所以不能再访问该对象并且可以将其丢弃。事实上,Python的垃圾收集器会为你做到这一点。
出错的地方是你还有列表中的所有实例。这也算作对物体的参考,因此它永远不会被处理掉。
例如,状态变量列表,不仅由其拥有对象引用,还由列表允许线性访问。从访问器中明确调用清理函数以保持列表清洁:
GlobalStateList = []
def gcOnGlobalStateList():
for s in reversed(GlobalStateList):
if (getrefcount(s) <= 3): # 1=GlobalStateList, 2=Iterator, 3=getrefcount()
GlobalStateList.remove(s)
def getGlobalStateList():
gcOnGlobalStateList()
return GlobalStateList
请注意,即使查看引用计数也会增加它,因此测试值为3或更低。
答案 1 :(得分:0)
假设您的概念SomeObject
&#34;到期&#34;与底层的Python对象生命周期没有直接关系(引用计数等)我建议清除列表的最简单方法是偶尔运行它,取消引用任何expired
个对象:
lst = [obj for obj in lst if not obj.expired]
请注意,您不应该调用自己的变量list
,因为这会影响内置变量。