我真的想不出Python需要del关键字的任何原因(而且大多数语言似乎都没有类似的关键字)。例如,与其删除变量,还不如将None赋值给它。当从字典中删除时,可以添加del方法。

在Python中保留del是有原因的吗,还是它是Python前垃圾收集时代的遗迹?


当前回答

这是我贡献的2美分:

我有一个优化问题,我使用一个Nlopt库。 我初始化类和它的一些方法,我在代码的其他几个部分使用。

我得到的结果是随机的,即使是同样的数值问题。

我刚刚意识到,通过这样做,一些虚假数据包含在对象中,而它应该没有任何问题。使用del后,我猜内存被正确地清除,这可能是一个内部问题的类,其中一些变量可能不喜欢被重用没有适当的构造函数。

其他回答

这是我贡献的2美分:

我有一个优化问题,我使用一个Nlopt库。 我初始化类和它的一些方法,我在代码的其他几个部分使用。

我得到的结果是随机的,即使是同样的数值问题。

我刚刚意识到,通过这样做,一些虚假数据包含在对象中,而它应该没有任何问题。使用del后,我猜内存被正确地清除,这可能是一个内部问题的类,其中一些变量可能不喜欢被重用没有适当的构造函数。

del所做的部分(来自Python语言参考):

删除名称将从本地或全局名称空间删除该名称的绑定

将None赋值给名称不会删除名称与名称空间的绑定。

(我想关于移除名称绑定是否真的有用可能会有一些争论,但这是另一个问题。)

另一个小众案例,但很有用。

from getpass import getpass

pass = getpass()
token = get_auth_token(pass)
del pass

# Assume more code here...

在删除pass变量之后,您不会冒它稍后被错误打印出来的风险,或者以其他方式结束在日志或堆栈跟踪中。

由于我还没有看到交互式控制台的答案,我将展示一个。

当foo=None时,该引用和对象存在,它不指向它。

而del foo也会销毁对象和引用。

如果你这样做如果foo是None并且它被删除了它就会升起NameError作为引用,它的对象所有介于两者之间的东西都会被del删除

删除目标列表会递归地从左到右删除每个目标。

与此同时,foo=None只是一个指向None的引用,因此引用仍然是有效的,对象也是如此。

[…在Python中,变量是对象的引用,任何变量都可以引用任何对象[…]

链接到引用1

链接到引用2

有一次我不得不使用:

del serial
serial = None

因为只使用:

serial = None

没有及时释放串口,无法立即再次打开。 从这一课中,我了解到del的真正意思是:“现在就开始!然后等待直到它完成”这在很多情况下都很有用。当然,你可能有一个system.gc.del_this_and_wait_balbalba (obj)。