我应该什么时候在python中使用del?

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,不会被清除.

  • "del"删除对值的引用这一事实的一个重要附件:如果该值除了您要删除的引用之外还有其他引用,它将继续存在.因此,除非您确定没有其他参考,否则您无法将"del"视为释放内存. (5认同)

Iva*_*van 8

一种用途是从字典中删除特定键。

>>>> food = {"apple": True, "banana": False}
>>>> del food['banana']
>>>> import json
>>>> json.dumps(food)
'{"apple": true}'
Run Code Online (Sandbox Code Playgroud)

在将字典转换为 JSON 之前,我一直使用它来清理字典。