我在Ipython笔记本上运行的以下代码的输出让我非常困惑:
class Point(object):
def __init(self, x=0, y=0):
self.x = x
self.y = y
def __del__(self):
class_name = self.__class__.__name__
print class_name, "destroyed"
pt1 = Point()
pt2 = pt1
输出如下,我似乎无法理解何时调用析构函数: 破坏点
另外,当我编写下面的代码并期望得到一个错误时,我不会
del pt1
del pt2
谢谢
Edit:我知道Python只在引用计数变为0时调用_del_()
,但我不明白的是为什么在输出中写入以下结果:Point destroyed
。你知道吗
pt1 = Point()
pt2 = pt1
另外,考虑到上述情况,我知道pt1
或pt2
都不存在,因此可能会在下面的代码中出现错误,但这不会发生。你知道吗
del pt1
del pt2
正如docs所说:
删除名称会从本地或全局命名空间中删除该名称的绑定,具体取决于该名称是否出现在同一代码块的全局语句中。如果名称未绑定,将引发NameError异常。
所以您只需从本地命名空间中删除两个条目,每次删除都会将引用计数减少一个。只有在ref count变为零之后,才会调用
__del__
。不是C;)我假设当多个变量指向同一个对象时,引用计数会发生一些变化。看下面的例子。你知道吗
现在让我们看看我们的
id
因此它们指向与预期相同的
list
。你知道吗L2
仍然存在并且仍然具有相同的id
,即使L1
被删除,这首先创建了对象。你知道吗长话短说,我认为Python使用引用计数,并且在引用计数降到0之前不会实际删除对象。你知道吗
关于您的编辑
注意,调用输出消息“Point destromed”是因为
del pt2
,因为pt1
没有调用它。你知道吗相关问题 更多 >
编程相关推荐