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