python – 覆盖对象实例不释放内存?
发布时间:2020-12-20 11:33:12 所属栏目:Python 来源:网络整理
导读:我有一个 python对象,它本质上是其他对象实例的集合.您可以向其追加其他对象(它只存储在列表中).它是在读取文件时创建的,例如: def file_reader(file): obj = MyCollection() for line in file: other_obj = line_reader(line) obj.append(other_obj) retur
我有一个
python对象,它本质上是其他对象实例的集合.您可以向其追加其他对象(它只存储在列表中).它是在读取文件时创建的,例如:
def file_reader(file): obj = MyCollection() for line in file: other_obj = line_reader(line) obj.append(other_obj) return obj 如果我稍后尝试覆盖该对象(通过读取不同的文件),原始数据不会被删除,该对象只是被扩展.奇怪的是,如果我使用不同的引用,这似乎会发生: obj1 = file_reader(file) obj2 = file_reader(file1) 我怀疑循环引用有一些问题,但我无法理解逻辑. 编辑: class MyCollection(object): def __init__(self,objs = []): self.objs = objs def append(self,obj): self.objs.append(obj) 解决方法
我会采取一种不那么疯狂的猜测,你现在有这样的事情:
class MyCollection(): listOfThings = [] def __init__(self): 在这种情况下,listOfThings是一个类属性,它在MyCollection类的所有实例之间共享.相反,您需要一个实例属性,为每个实例分开: class MyCollection(): def __init__(self): self.listOfThings = [] 编辑:太近了! 你遇到的问题是: def __init__(self,objs = []): 这里,objs被称为“可变默认参数”.默认参数值中的列表是为该类的所有未传递任何内容的实例共享的__init __(定义a = MyCollection([]),例如,将创建一个带有单独objs列表的新实例). 你应该使用: def __init__(self,objs=None): if objs is None: objs = [] 涵盖这个的典型问题:“Least Astonishment” and the Mutable Default Argument (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |