kpi*_*pie 6 python memory-management
所以我很好奇,我可以说我有一个课程如下
class myClass:
def __init__(self):
parts = 1
to = 2
a = 3
whole = 4
self.contents = [parts,to,a,whole]
Run Code Online (Sandbox Code Playgroud)
是否有任何添加线的好处
del parts
del to
del a
del whole
Run Code Online (Sandbox Code Playgroud)
在构造函数内部或者这些变量的内存是否由作用域管理?
Dmi*_*rba 16
从来没有,除非你对记忆非常紧张并做一些非常笨重的事情.如果你正在编写通常的程序,垃圾收集器应该处理所有事情.
如果你正在写一些笨重的东西,你应该知道del不删除对象,它只是取消引用它.即变量不再指存储对象数据的内存中的位置.之后,它仍然需要被垃圾收集器清理,以便释放内存(这会自动发生).
还有一种方法可以强制垃圾收集器清理对象 - gc.collect()这在运行后可能很有用del.例如:
import gc
a = [i for i in range(1, 10 ** 9)]
...
del a
# Object [0, 1, 2, ..., 10 ** 9 - 1] is not reachable but still in memory
gc.collect()
# Object deleted from memory
Run Code Online (Sandbox Code Playgroud)
更新:评论中非常好.观察内存中对象的其他引用.例如:
import gc
a = [i for i in range(1, 10 ** 9)]
b = a
...
del a
gc.collect()
Run Code Online (Sandbox Code Playgroud)
执行此块后,大型阵列仍可通过b,不会被清除.
一种用途是从字典中删除特定键。
>>>> food = {"apple": True, "banana": False}
>>>> del food['banana']
>>>> import json
>>>> json.dumps(food)
'{"apple": true}'
Run Code Online (Sandbox Code Playgroud)
在将字典转换为 JSON 之前,我一直使用它来清理字典。