如何释放对象中的Python列表?

时间:2010-08-12 12:40:05

标签: python list

我有一个包含列表的Python类,我append()值。

如果我删除此类的对象,然后在同一个脚本中创建第二个对象,则第二个对象的列表与删除时的第一个对象相同。

例如:

class myObj:
    a = []
    b = False

o = myObj()
o.a.append("I'm still here!")
o.b = True

del o
import gc
gc.collect() # just to be safe
o = myObj()

print(o.a) # ["I'm still here!"]
print(o.b) # False

清空列表的方法:

while len(o.a):
    o.a.pop()

但那太荒谬了,更不用说慢了。为什么它在垃圾收集后仍然在内存中,更重要的是为什么它不会在类进入时被覆盖?正确处理所有非列表成员变量。 append()extend()insert()都会导致相同的结果 - 我应该使用另一种方法吗?

Here's my full test script.请注意,如果我尝试直接删除成员列表,Python会给出一个AttributeError,即使我可以从中读取它。

1 个答案:

答案 0 :(得分:9)

在类声明中创建变量时,它是类属性,而不是实例属性。要创建实例属性,您必须在方法中执行self.a,例如__init__

将其更改为:

class myObj:
    def __init__(self):
        self.a = []
        self.b = False