我有一个列表,其中包含不确定数量的对象实例。其中一些对象也包含自己的对象:
class foo:
var1 = 0
var2 = [objc()]
list = [foo(), foo(), foo(), foo()]
如果通过重新定义清单清空此列表 - 此操作是否会删除列表中的所有对象(包括内存中的对象)?
list = []
del
会工作吗?
del list
方法pop
?
for e in list:
list.pop()
答案 0 :(得分:0)
简短回答 - 这取决于。
你的第一个例子并不好,因为foo.var2
是一个类属性,即它是在字节码编译时创建的。您可以通过foo.var2
访问它。
对于my_foo = foo()
,其my_foo.var2
与foo.var2
是同一个对象,而foo
类的每个其他实例加foo.var2
1}}本身除非它已被同名的对象变量覆盖,即my_foo.var2 = []
。
在编译时或者在python中导入类时,都不会取消分配类属性。
所以关于如何释放类属性的具体问题的答案是你做不到的。只要有一个对它的引用,如果导入了类就会一直存在,GC将永远不会释放它。
此外,更改类的一个实例中的类属性成员(如使用.pop
)将更改所有其他实例以及类属性本身,因为它们是同一个对象。
一般来说,由于上述原因,可变对象作为类属性是一个坏主意。
将可变事物的实例变量,静态事物的类属性 - 这就是它们的用途。取消引用将按预期工作。
class Foo(object):
st1 = "something static"
def __init__(self):
self.var1 = 0
self.var2 = [objc()]
foo = Foo()
# De-allocates objc() if there are no other references to it
foo.var2 = []