You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中__del__在VSCode自动触发Jupyter不触发的问题咨询

代码合法性说明

你编写的代码没有任何语法或逻辑问题,__del__方法的定义和使用都符合Python规范。

class Student:
    # constructor
    def __init__(self, name):
        print('Inside Constructor')
        self.name = name
        print('Object initialized')

    def show(self):
        print('Hello, my name is', self.name)

    # destructor
    def __del__(self):
        print('Inside destructor')
        print('Object destroyed')

# create object
s1 = Student('Emma')
s2 = s1;
s3 = s1;
print("Id of S1: " , id(s1));

__del__方法的触发规则

  • __del__本质是Python垃圾回收的钩子函数,不是传统意义上的析构函数,仅当对象的引用计数归0时,才会在对象被回收前自动调用
  • 即便你没有手动执行del删除引用,当Python进程退出时,解释器会销毁所有全局对象,此时对象引用计数会清零,__del__也会被触发

两个运行环境的差异原因

  1. VSCode运行逻辑:你在VSCode中运行的是独立Python脚本,脚本执行完毕后Python进程会直接退出,全局变量s1、s2、s3全部失效,Student实例的引用计数降到0,__del__自然会被触发。VSCode本身不会干预Python的垃圾回收逻辑,所有回收动作都是Python解释器本身的默认行为。
  2. Jupyter Notebook运行逻辑:Jupyter采用常驻Python内核的交互式运行模式,单个代码Cell执行完成后内核不会退出,s1、s2、s3三个变量仍保存在内核的全局命名空间中,Student实例的引用计数仍为3,不会被垃圾回收,因此__del__不会自动触发。如果你在Cell末尾手动执行del s1; del s2; del s3,再调用import gc; gc.collect()手动触发垃圾回收,就能看到__del__的输出。

内容的提问来源于stack exchange,提问作者DanishAnsari09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:18:03