Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生命周期过期后从列表中删除对象_Python_Oop - Fatal编程技术网

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
子句将尝试访问不再存在的对象。