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

时间:2018-11-12 13:05:14

标签: python python-3.x instance del

我有以下代码:

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

node1 = Node(12)
cur = node1

是否可以使用node1删除cur

我尝试了del cur,但是它无法提供理想的结果cur现在不再存在,但是node1仍然存在。

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

我们清除一个误解:Python中没有“分配”对象。

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

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

查看此visualization。请注意node1cur的箭头如何指向相同的Node对象在内存中的位置。如果单击“前进”,您将看到执行del cur时唯一发生的是cur的箭头将被删除(即cur将不再引用相同的箭头node1引用的内存位置)。

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

请参阅以下2个场外资源以获取有用的信息:

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

答案 1 :(得分:1)

除了DeepSpace答案外,没有其他方法可以删除node1,除了找到引用该实例的所有变量,然后删除它外,我想出了一个函数来代替{{1} }:

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