理解Python中的内存分配

2024-04-27 03:08:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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

另外,考虑到上述情况,我知道pt1pt2都不存在,因此可能会在下面的代码中出现错误,但这不会发生。你知道吗

del pt1
del pt2

Tags: 代码nameselfobjectinitdef错误ipython
2条回答

正如docs所说:

删除名称会从本地或全局命名空间中删除该名称的绑定,具体取决于该名称是否出现在同一代码块的全局语句中。如果名称未绑定,将引发NameError异常。

所以您只需从本地命名空间中删除两个条目,每次删除都会将引用计数减少一个。只有在ref count变为零之后,才会调用__del__。不是C;)

我假设当多个变量指向同一个对象时,引用计数会发生一些变化。看下面的例子。你知道吗

L1 = [1,2,3]
L2 = L1

现在让我们看看我们的id

>>> id(L1)
49127672

>>> id(L2)
49127672

因此它们指向与预期相同的list。你知道吗

del L1

>>> L2
[1, 2, 3]

>>> id(L2)
49127672

L2仍然存在并且仍然具有相同的id,即使L1被删除,这首先创建了对象。你知道吗

长话短说,我认为Python使用引用计数,并且在引用计数降到0之前不会实际删除对象。你知道吗

关于您的编辑

del pt1    # Reference count dropped from 2 to 1, __del__ is NOT called
del pt2    # Reference count dropped from 1 to 0, __del__ called

注意,调用输出消息“Point destromed”是因为del pt2,因为pt1没有调用它。你知道吗

相关问题 更多 >