我想在python中删除一个类实例或使其为None。但是我无法做到。一般来说,我的代码执行如下操作: -
class Foo:
pass
f = Foo()
g = Foo()
f.attr = g
h = f.attr
del h
print f.attr # This is not None but it should be right?
更具体地说,在python中实现二叉搜索树时出现了这个问题。我的删除功能是这样的: -
class Tree:
def delete(self, key):
min_right = self.right.getmin()
self.key = min_right.key
del min_right # Does not work
我做错了什么或是预期的行为?如果是预期的,OOP标准的最佳方法是什么才能实现我的目标?
答案 0 :(得分:3)
您的情况如下:
g
|
<__main__.Foo object at 0x...>
/ \
f.attr h
即。三个引用到相同的底层对象。 del h
所做的只是删除名称h
,如下所示:
g
|
<__main__.Foo object at 0x...>
/
f.attr
基础对象没有变化,而另外两个名称仍然提供对它的引用,您所做的就是删除对Foo
实例的一个引用。 h
现在是NameError
,但g
和f.attr
可以正常使用。
# This is not None but it should be right?
我不知道为什么你会得出结论 - 如果你 成功地打破了从f.attr
到Foo
实例的引用,你会得到一个AttributeError
,而非None
。
推荐读取Python名称:http://nedbatchelder.com/text/names.html
答案 1 :(得分:1)
删除属性:
del f.attr
它会消失而不是None
。
将其设为None
:
f.attr = None
不要使用中间变量!