Python 类如何处理未分配的类实例?

标签 python class memory-management

有人知道这样的代码是如何处理的吗?

myclass().mymethod()

通常情况下,你会将你的类分配给一个变量,并在不需要时销毁它,在这种情况下,python 会运行代码并在之后释放内存,还是会一直挂起直到程序结束?

上面的内容更清晰,为什么当您不再需要它时分配给变量呢? 我以为我会在将上述代码放入我的项目之前找到答案。 :)

最佳答案

假设myclass().mymethod()不会创建对myclass()的额外引用(通过方法的self参数),一旦 mymethod() 返回 myclass() 将再次从内存中删除。

CPython 使用引用计数来跟踪周围有哪些对象。当您创建 myclass() 时,堆栈会保存对其的一个引用。然后,解释器查找 mymethod 属性,该属性是一个方法,创建对存储在方法对象上的 myclass() 对象的另一个引用。堆栈保留方法对象,使方法对象保持事件状态以进行下一步。然后调用该方法,该方法将对象作为 self 传递给函数;这是第三个引用。

如果该方法未将 self 添加到任何其他结构(将 selfself 上的另一个方法添加到全局列表,例如例如),然后当方法返回时,self本地名称被清理,引用计数下降到2。方法本身不再需要,它被从堆栈中删除(这会破坏方法对象,因为它现在有 0 个引用),并且 myclass() 的引用计数下降到 1。 myclass() 对象也不再使用,因此计数下降为 0,并且实例从内存中删除。

关于Python 类如何处理未分配的类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22405638/

相关文章:

python - 为什么代码在收到响应后不执行

Python time.sleep(1) 立即完成

java - 创建 "noname"类实例

objective-c - Cocoa内存管理,为什么我的应用程序不断使用更多?

python - 使用python opencv进行预处理以查找两个图像之间的差异

python - 动态添加字段到表单 python django

javascript - 为什么我不能使用带有多重选择器的 prop() 翻转检查属性?

c++ - 分配给类中函数指针的函数

使用 mxArray 的 C++ 动态内存分配

memory-management - 为什么堆栈地址会朝着减少内存地址的方向增长?