【问题标题】:How to delete object assigned to variable?如何删除分配给变量的对象?
【发布时间】:2018-11-12 13:05:14
【问题描述】:

我有以下代码:

class Node:
  def __init__(self, item):
    self.item = item  

node1 = Node(12)
cur = node1

是否可以使用cur删除node1

我尝试了del cur,但它没有给出预期的结果cur 现在不再存在,但node1 仍然存在。

任何帮助表示赞赏。

【问题讨论】:

  • 另外,如果您删除 node1Node 实例将不会从内存中删除。如果没有其他对它的引用,它最终会被垃圾回收器删除。

标签: python python-3.x instance del


【解决方案1】:

除了 DeepSpace 的答案,没有办法删除 node1 除非你找到所有引用该实例的变量,然后删除它,我想出了一个函数来代替 del 用于你的目的:

import sys

def kill(name):
    l = []
    for k, v in sys.modules[__name__].__dict__.items():
        if str(v) == str(name):  # Finding all vars that refers to that instace
            l.append(k)

    for i in l:  # Deleting them
        del sys.modules[__name__].__dict__[i]

所以,如果你有这个课程

class Node:
    def __init__(self, item):
        self.item = item  

node1 = Node(12)
cur = node1

如果你输入:

kill(cur)

node1 以及引用该实例的所有其他人都将被删除。

测试:

In [116]: node1
Out[116]: <__main__.Node at 0x7f68eca386d8>

In [117]: cur
Out[117]: <__main__.Node at 0x7f68eca386d8>

In [118]: kill(cur)

In [119]: cur
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-119-3c1cfaee77de> in <module>()
----> 1 cur

NameError: name 'cur' is not defined

In [120]: node1
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-120-d9e9a8ca6efc> in <module>()
----> 1 node1

NameError: name 'node1' is not defined

【讨论】:

    【解决方案2】:

    让我们澄清一个误解:对象在 Python 中不是“分配”的。

    变量只是对内存中恰好包含值的位置的引用。

    通过del cur,您只是确保cur 没有引用node1 也引用的内存位置,但node1 不会发生任何事情。

    看看这个visualization。注意node1cur 的箭头如何指向同一个Node 对象在内存中的位置。如果你点击“Forward”你会看到当del cur被执行时,唯一会发生的事情是cur的箭头将被移除(即cur将不再引用内存中与@987654334相同的位置@引用)。

    如果不做del node1,就没有办法对node1做同样的事情,即使这样,垃圾收集器也可以决定何时删除Node对象本身(这实际上会释放内存)它需要)。这取决于 Python 解释器的具体实现,但这通常是通过引用计数来完成的。

    有关有用信息,请参阅这 2 个非现场资源:

    Python's garbage collectorFacts and myths about Python names and values

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-01
      • 2016-08-04
      • 2020-02-04
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多