如何删除python3中的对象*

如何删除python3中的对象*,python,memory,Python,Memory,我正在写一个二叉树类。我想删除整个树(其中的所有节点),所以我想了解如何在python中删除对象 我有函数del_obj(obj)。我通过了“a”,它不能正常工作。我想,这是“a”的复制品。但是id方法显示相同的id。我很困惑 def del_obj(obj): print(id(obj)) # 111

我正在写一个二叉树类。我想删除整个树(其中的所有节点),所以我想了解如何在python中删除对象

我有函数del_obj(obj)。我通过了“a”,它不能正常工作。我想,这是“a”的复制品。但是id方法显示相同的id。我很困惑

def del_obj(obj):                                                               
   print(id(obj)) # 111                                                              
   del obj                                                                     

a = 3                                                                           
print(id(a)) # 111                                                                    
del_obj(a)
print(a) # 3  

您需要在外部范围内说
dela
。您的
del_obj
函数不起作用,因为它只删除自己的引用,这不会影响该函数之外的代码。

您需要在外部范围内说
dela
。您的
del_obj
函数不起作用,因为它只删除自己的引用,这不会影响该函数之外的代码。

在Python中,
del
不会删除对象,而是删除名称。只有当无法再从任何名称访问对象时,才会删除该对象

一旦无法通过任何名称访问树的根,树中只能通过与该根对象关联的名称访问的所有其他节点本身将无法访问,并且所有节点都将被删除,除非有人在某处有另一个名称指向其中一个节点

(如果您有一个名称循环,那么仍然应该清理所有名称,但在这种情况下,CPython实现有一些缺陷。但是,由于您将数据结构描述为一棵树,这可能不适用于您的情况。)


我建议您阅读这篇经典文章。

在Python中,
del
不会删除对象,而是删除名称。只有当无法再从任何名称访问对象时,才会删除该对象

一旦无法通过任何名称访问树的根,树中只能通过与该根对象关联的名称访问的所有其他节点本身将无法访问,并且所有节点都将被删除,除非有人在某处有另一个名称指向其中一个节点

(如果您有一个名称循环,那么仍然应该清理所有名称,但在这种情况下,CPython实现有一些缺陷。但是,由于您将数据结构描述为一棵树,这可能不适用于您的情况。)

我建议你阅读这篇经典文章