gpt4 book ai didi

python - Python 3.x 中动态 View 对象的范围

转载 作者:行者123 更新时间:2023-11-28 16:28:22 26 4
gpt4 key购买 nike

删除原始对象后,python 中的 View 对象会发生什么情况?例如,

a = {'foo': 1 , 'bar': 2, 'baz': 3 }
b = a.keys() # => dict_keys(['bar', 'foo', 'baz'])

此时,如果对字典进行了任何更改,它们将反射(reflect)在 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())

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

最佳答案

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

因此,您不会删除字典,而是删除指向它的名称。只有当没有更多的名字(对字典的引用)剩下时,垃圾收集器才会删除字典。

如果您以结构化方式使用不适用于全局对象的函数进行编程,则内存泄漏相当罕见。在实践中,del 通常很少使用。

关于python - Python 3.x 中动态 View 对象的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34572409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com