【问题标题】:Clear variable in python在python中清除变量
【发布时间】:2012-01-04 11:26:48
【问题描述】:

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

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

class Node:
    self.left = somenode1
    self.right = somenode2

如果我想从树中删除某个节点,我需要将self.left 设置为空。

【问题讨论】:

标签: python


【解决方案1】:

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

variable = None; del variable

【讨论】:

    【解决方案2】:

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

    好的,我想我有一个最好的替代 @bnaul's answer 的想法:

    您可以使用del删除个人姓名:

    del x
    

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

    for name in dir():
        if not name.startswith('_'):
            del globals()[name]
    

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

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

    【讨论】:

      【解决方案3】:
      • 如果想完全删除它,请使用del

        del your_variable
        
      • 否则,将值设为None

        your_variable = None
        
      • 如果它是一个可变可迭代(列表、集合、字典等,但不是元组,因为它们是不可变的),您可以将其设为空,如下所示:

        your_variable.clear()
        

      那么your_variable将为空

      【讨论】:

        【解决方案4】:

        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
        

        但在这种情况下,我投票给self.left = None

        【讨论】:

        • 有时这不会完全删除它,只会删除内存中对 a 的引用。这可能会在内存中留下无法获取 gc 的幽灵变量。
        • del 也有一个缺点,即如果您尝试删除一个不存在的变量,则会引发异常,这通常是不可取的。
        • 我只是想指出,如果你不小心声明了一个覆盖内置命令的变量,例如,type=… ,当你打算输入 type(…) 时,删除它是最简单的返回方法原来的功能。也就是说,如果您将其保留为 None ,您仍然会切断对底层函数的访问。
        • 垃圾收集/收集器/已收集
        • 这是我要找的那个。在 cmd 行玩,我有 ...set = set(myList) 然后意识到我不能再将 set 用作函数(doh)。使用del set 让我可以再次将其用作特效。当然,我永远不会在实际脚本中使用那个保留的 var。
        【解决方案5】:

        我使用了上面提到的几个选项:

        del self.left
        

        或使用

        将值设置为 None
        self.left = None
        

        当您使用将值设置为无时,了解差异并放置一些异常处理程序非常重要。如果您使用模板打印条件语句的值,例如,

        print("The value of the variable is {}".format(self.left))
        

        您可能会看到变量的值打印“变量的值是无”。因此,您必须在那里放置一些异常处理程序:

        if self.left:
            #Then only print stuff
        
        

        上面的命令只会在 self.left 不是None时打印值

        【讨论】:

          【解决方案6】:

          self.left = None 有什么问题?

          【讨论】:

          • 不熟悉 None 关键字。这与其他语言中的 null 类似吗?
          • 是的;它相当于null。
          • @Bnicholas 但是,它不像 PHP 中的 null,因为在 PHP 中将变量设置为 null 在大多数情况下会产生类似的行为,就好像你一开始没有定义它一样. Python 中的 None 值与未定义的变量完全不同。 Nonenull 的大多数其他化身非常相似,但是(至少在我们了解更多神秘的细节之前)。
          • 打开python终端并输入print x并回车。当您尝试打印未定义的变量时,这将产生解释器错误,就像大多数语言一样。但是,如果您定义变量,然后尝试使用 None 清除它,则使用 print x 代码将生成单词 None 作为输出。我是 python 新手,所以我可能会弄错,但这看起来不像是清除变量的行为。
          • 这个解决方案不是最好的解决方案。它只是将其分配为 null,但它仍然是一个变量。如果您要覆盖关键字 - 那么您仍然会在尝试调用 none 类型时遇到错误。使用del variable
          【解决方案7】:

          var = None“清除值”,将变量的值设置为“null”,就像“None”的值一样,但是指向变量的指针仍然存在。

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

          如果您想稍后使用该变量,例如为其设置一个新值,即保留变量,None 会更好。

          【讨论】:

          • 如果我想完全删除在某些情况下不存在的变量怎么办。是否有任何参数可以避免错误?我需要删除几个变量:del a, b, c, d 我可以使用循环和 try/except,但我更喜欢一些开关来避免它。
          【解决方案8】:

          实际上,这不会删除变量/属性。它所要做的就是将其值设置为None,因此该变量仍将占用内存空间。如果你想从内存中彻底清除所有存在的变量,你可以输入:

          del self.left
          

          【讨论】:

          • 我不明白为什么 =None 答案如此受欢迎。这是正确答案
          • OP 说的是 clear 而不是 remove。 del 将终止属性和查找。将其设置为 None 比检查 if self.left 更干净,这足以检查节点是否为空。
          • “将其设置为 None 会更简洁”——值得考虑的是,如果有人(您自己或合作者一段时间后)正在阅读代码 del,恕我直言,这会更明显在“心理解析”代码时可以忘记变量。
          • @NikolayGromov 在您的日常代码中,当您想要获取 self.left 的值时,您更愿意检查 if self.left:,还是更愿意处理可能的 NameError 异常如果你不在任何地方处理它,你的程序就会崩溃?
          • 检查gcore $PID,你的变量还在内存中。
          猜你喜欢
          • 1970-01-01
          • 2019-08-12
          • 2022-11-10
          • 1970-01-01
          • 2013-08-13
          • 2013-08-20
          • 2012-05-31
          • 2014-01-13
          • 1970-01-01
          相关资源
          最近更新 更多