Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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_Object_Memory Management - Fatal编程技术网

Python 将值重新分配给变量会清空内存吗?

Python 将值重新分配给变量会清空内存吗?,python,object,memory-management,Python,Object,Memory Management,我有一个列表,其中的对象实例数量不确定。其中一些对象还包含自己的对象: class foo: var1 = 0 var2 = [objc()] list = [foo(), foo(), foo(), foo()] 如果此列表通过重新定义而清空-此操作是否会从内存中删除列表中的所有对象(包括其中的对象) del有效吗 del list 以及方法pop for e in list: list.pop() 简短的回答——视情况而定 您的第一个示例并不好,因为foo.v

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

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

list = [foo(), foo(), foo(), foo()]
如果此列表通过重新定义而清空-此操作是否会从内存中删除列表中的所有对象(包括其中的对象)

del
有效吗

del list
以及方法
pop

for e in list:
    list.pop()

简短的回答——视情况而定

您的第一个示例并不好,因为
foo.var2
是一个class属性,即它是在字节码编译时创建的。您可以通过
foo.var2
访问它

对于
my_foo=foo()
,它的
my_foo.var2
是与
foo.var2
相同的对象,并且在
foo
类的每个其他实例上加上
foo.var2
本身,除非它已被同名的对象变量覆盖,即
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 = []
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 = []