Python 生命周期过期后从列表中删除对象
我正在创建一个随机生成对象的程序。这些对象的生存期有限 我创建这些对象并将它们放置在列表中。这些对象跟踪它们存在的时间和最终的过期时间。过期后不再需要它们 我想在对象过期后删除它们,但我不确定如何引用列表中的特定对象来删除它Python 生命周期过期后从列表中删除对象,python,oop,Python,Oop,我正在创建一个随机生成对象的程序。这些对象的生存期有限 我创建这些对象并将它们放置在列表中。这些对象跟踪它们存在的时间和最终的过期时间。过期后不再需要它们 我想在对象过期后删除它们,但我不确定如何引用列表中的特定对象来删除它 if something: list.append(SomeObject()) ----后来--- 我想要一个清理过程,查看对象中的变量,如果该变量已过期,则将其从列表中删除 提前感谢您的帮助。如果您将“不再使用”定义为“没有其他对象保留引用”,则可以使用ref
if something:
list.append(SomeObject())
----后来---
我想要一个清理过程,查看对象中的变量,如果该变量已过期,则将其从列表中删除
提前感谢您的帮助。如果您将“不再使用”定义为“没有其他对象保留引用”,则可以使用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
GlobalStateList=[]
def gcOnGlobalStateList():
对于反向(全局状态列表)中的s:
如果(getrefcount)假设您的SomeObject
“expiry”概念与底层Python对象生命周期(引用计数等)没有直接关系,我建议清除列表的最简单方法是偶尔运行列表,取消引用任何过期的对象:
lst = [obj for obj in lst if not obj.expired]
请注意,您不应该调用自己的变量list
,因为这会影响内置变量。您能通过检查判断对象是否已过期吗?类似于list=[obj for obj in list if not obj.expired]
work?您想使用weakref
。您可能需要使用额外的weakkey/value字典,但这应该可以。jonrsharpe-谢谢,该解决方案对我有效。对象从列表或其可能所在的其他容器中删除自己是一个糟糕的设计。jonsharpe的评论显示了其他外部内容如何更新t列表是一种更好的方法。@jonrsharpe:我认为这样做的唯一问题是,如果某个对象确实已被删除,那么if not obj.expired
子句将尝试访问不再存在的对象。