如何删除分配给变量的对象?

How to delete object assigned to variable?

我有以下代码:

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

node1 = Node(12)
cur = node1

是否可以使用 cur 删除 node1

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

感谢任何帮助。

让我们澄清一个误解:对象不在 Python 中 "assigned"。

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

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

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

如果不执行 del node1,就无法对 node1 执行相同的操作,即便如此,也由垃圾收集器决定何时删除 Node 对象本身(这实际上会释放它占用的内存)。这取决于 Python 解释器的具体实现,但这通常是通过引用计数来完成的。

查看这 2 个站外资源以获取有用信息:

Python's garbage collector and Facts and myths about Python names and values

除了 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

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