del 不直接删除对象,而是删除变量对对象的引用;对象是否销毁取决于引用计数是否降为0,降为0时CPython立即回收内存。
不是。del 并不直接删除对象,而是删除变量对对象的引用。对象是否被真正销毁,取决于此时还有没有其他变量或结构在引用它——核心机制是 Python 的引用计数(Reference Counting)。
当你写 del x,Python 做的只是从当前作用域的命名空间中移除名字 x,断开它与所指向对象之间的连接。如果这个对象此前只被 x 引用,那么它的引用计数会减 1;若减到 0,对象才被立即回收。
x = [1, 2, 3] → 列表对象引用计数为 1y = x → 同一个列表现在被两个变量引用,引用计数变为 2del x → 引用计数减为 1,对象还在,
y 仍可正常访问del y → 引用计数降为 0,列表对象被立即释放(假设无循环引用等特殊情况)每个 Python 对象内部都维护一个整数字段 ob_refcnt,记录当前有多少个地方“持有”它:
del、变量重新赋值、函数返回、容器弹出元素等,会使引用计数 −1tp_dealloc),释放内存并执行清理逻辑(如关闭文件、释放资源)即使你 del 了所有显式变量,对象也不一定立刻消失:
del 只是辅助打破循环的第一步可以借助 sys.getrefcount(obj) 查看当前对象的引用计数(注意:该函数调用本身会让计数临时 +1):
import sys a = [1, 2, 3] print(sys.getrefcount(a)) # 输出通常为 2(1 个来自 a,1 个来自 getrefcount 参数) b = a print(sys.getrefcount(a)) # 输出通常为 3 del a print(sys.getrefcount(b)) # 输出通常为 2(b 还在,加上参数传递的一次)