将值重新赋值给变量清空内存?

时间:2017-04-25 16:23:34

标签: python object memory-management

我有一个列表,其中包含不确定数量的对象实例。其中一些对象也包含自己的对象:

class foo:
    var1 = 0
    var2 = [objc()]

list = [foo(), foo(), foo(), foo()]

如果通过重新定义清单清空此列表 - 此操作是否会删除列表中的所有对象(包括内存中的对象)?

list = []

del会工作吗?

del list

方法pop

for e in list:
    list.pop()

1 个答案:

答案 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 = []