我有以下代码:
class Node:
def __init__(self, item):
self.item = item
node1 = Node(12)
cur = node1
是否可以使用node1
删除cur
?
我尝试了del cur
,但是它无法提供理想的结果cur
现在不再存在,但是node1
仍然存在。
任何帮助表示赞赏。
答案 0 :(得分:2)
我们清除一个误解:Python中没有“分配”对象。
变量只是对内存中恰好包含值的位置的引用。
通过执行del cur
,您仅确保cur
不引用node1
所引用的存储位置,但是node1
不会发生任何事情。
查看此visualization。请注意node1
和cur
的箭头如何指向相同的Node
对象在内存中的位置。如果单击“前进”,您将看到执行del cur
时唯一发生的是cur
的箭头将被删除(即cur
将不再引用相同的箭头node1
引用的内存位置)。
如果不做node1
,就无法对del node1
进行同样的操作,即使如此,还是由垃圾收集器来决定何时删除Node
对象本身(实际上会释放它占用的内存)。这取决于Python解释器的具体实现,但这通常是通过引用计数来完成的。
请参阅以下2个场外资源以获取有用的信息:
Python's garbage collector和Facts 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