在python中清除变量

Bni*_*las 188 python

有没有办法在python中清除变量的值?

例如,如果我正在实现二叉树:

Class Node:
    self.left = somenode1
    self.right = somenode2
Run Code Online (Sandbox Code Playgroud)

如果我想从树中删除一些节点,我需要设置self.left为空.

sta*_*ify 364

del关键字会做.

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
Run Code Online (Sandbox Code Playgroud)

编辑:但在这种情况下,我投票支持self.left = None

  • 我只想指出,如果你不小心声明了一个覆盖内置命令的变量,例如`type = ...`,当你打算键入`type(...)`时,删除它是获取原始功能的最简单方法.也就是说,如果你把它保持为无,你仍然会切断对底层函数的访问. (29认同)
  • 有时这不会完全删除它只会删除对内存中的引用.这可能会在内存中留下不会获得gc的ghost变量. (16认同)
  • `del`也有一个缺点,如果你试图删除一个不存在的变量,它会引发一个异常,这通常是*不合需要的. (4认同)
  • 垃圾收集/收集器/已收集 (2认同)

bna*_*aul 149

怎么了self.left = None?我是否误解了您的问题,或者您是否只是不熟悉该self.left = None关键字?

  • 人们来这里了解德尔,而不是没有. (34认同)
  • 打开python终端并输入`print x`并按Enter键.当您尝试打印未定义的变量时,这将产生解释器错误,就像大多数语言一样.但是如果定义变量,然后尝试用None清除它,使用`print x`代码将产生单词`None`作为输出.我是python的新手所以我可能会弄错,但这似乎不是清除变量的行为. (15认同)
  • 不熟悉None关键字.这在其他语言中类似于null吗? (13认同)
  • @Bnicholas然而,它不像PHP中的`null`,因为在PHP中将变量设置为"null"会在大多数情况下为您提供类似的行为,就像您首先没有定义它一样.Python中的"None"值与未定义的变量完全不同."无"与大多数其他"null"的化身非常相似(至少我们进入更多神秘的细节). (10认同)
  • 是; 它相当于null. (3认同)
  • 该解决方案不是最佳解决方案。它只是将其指定为 null,但它仍然是一个变量。如果您要覆盖关键字 - 那么您在尝试调用 none 类型时仍然会遇到错误。使用`del变量` (3认同)

小智 98

var = None "清除值",将变量的值设置为"null",如"None"的值,但是指向变量的指针仍然存在.

del var 完全删除变量的定义.

如果你想稍后使用变量,例如为它设置一个新值,即保留变量,None会更好.


小智 62

实际上,这不会删除变量/属性.它所做的就是将其值设置为None,因此该变量仍将占用内存空间.如果要从内存中完全擦除变量的所有存在,只需键入:

del self.left
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么=无答案如此受欢迎.这是正确的答案 (8认同)

U10*_*ard 28

如果要完全删除它使用del:

__PRE__

否则:

__PRE__

顺便说一句,如果你有一个列表或元组,可以使其为空:

__PRE__

然后del your_variable将是空的


小智 5

你想删除一个变量,不是吗?

好吧,我想我对@bnaul 的答案有一个最好的替代想法:

您可以使用以下命令删除个人姓名del

del x
Run Code Online (Sandbox Code Playgroud)

或者您可以将它们从globals()对象中删除:

for name in dir():
    if not name.startswith('_'):
        del globals()[name]
Run Code Online (Sandbox Code Playgroud)

这只是一个示例循环;它防御性地仅删除不以下划线开头的名称,(并非无理)假设您仅在解释器中使用开头不带下划线的名称。如果您确实想要彻底,可以使用硬编码的名称列表来保留(白名单)。除了退出并重新启动解释器之外,没有内置功能可以为您进行清除。

您导入的模块(例如import os)将保持导入状态,因为它们被sys.modules;引用。后续导入将重用已导入的模块对象。您只是不会在当前的全局命名空间中引用它们。


Uma*_*air 5

通过将其设置为 来删除其内容None,然后del从内存中删除其指针

variable = None; del variable
Run Code Online (Sandbox Code Playgroud)