Python 3.x中动态视图对象的范围

马克杯

删除原始对象后,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())

但我正在使用视图对象,因为与列表相比,它们的内存占用量较小。

迈克·米勒

我建议不要使用术语变量更好地使用允许访问对象的名称对于您的示例ab是对象字典的名称字典的键。在Python 3中dict.keys(),您提供了一个键视图对象,该对象反映了基础字典中的更改。因此,键视图对象保留对字典的引用。

因此,您不必删除字典,而是要删除指向该字典的名称。只有在没有其他名称(对字典的引用)的情况下,垃圾收集器才会删除该字典。

如果您使用无法在全局对象上运行的函数以结构化方式进行编程,则内存泄漏非常少见。实际上del通常很少使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章