在 Python 中,当原始对象被删除后,视图对象会发生什么?例如,
a = {'foo': 1 , 'bar': 2, 'baz': 3 }
b = a.keys() # => dict_keys(['bar', 'foo', 'baz'])
现在,如果对字典进行任何更改,这些更改都会反映在b中。例如,
a['qux'] = 4
print(b) # => dict_keys(['bar', 'qux', 'foo', 'baz'])
然而,当字典被删除时,动态变量仍包含已删除字典中所有键的值。
del a
a # NameError: name 'a' is not defined
print(b) # => dict_keys(['bar', 'qux', 'foo', 'baz'])
问题
本质上,我想知道在删除字典后,是否必须始终确保删除具有键值的任何变量。如果字典很大,这样做可能会导致内存泄漏吗? 感谢您的反馈。
附注:
是的,我知道我可以将键放入列表中:
c = list(a.keys())
但是我使用视图对象,因为它们比列表具有更小的内存占用。
a
被删除了,但是变量名b
仍然持有对实际对象即字典键的引用,因此该对象无法被删除。 - Padraic Cunninghamb = a; del a
,尽管a
已被删除,但b
仍然存在。 - Remi Guandel
是相当罕见的——也许最常见的有效使用方式是通过索引从集合中删除项目,例如del foo[key]
。不应将del a
解释为“删除名为a
的对象”,而应该解释为“删除名称a
”;也就是说,del
只是解除名称与对象之间的绑定关系。如果指向a
曾经指向的对象存在其他名称或引用,则该对象将继续存在于内存中。否则,内存将被释放。重要的是,如果您在代码中频繁使用del
(可能并非如此),那么这可能是不必要的。 - jmedel
不是函数,而是关键字语句。你不需要(通常也不应该)在它后面加括号,就像你在return
后面不用加括号一样。 - ShadowRanger