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

Python pickle序列化类对象后反序列化为何与原类属性同步且ID相同?

现象原因解析

1. pickle序列化类对象的核心规则

pickle处理类对象时的序列化逻辑和普通类实例完全不同:

  • 执行pickle.dumps(类对象)时,不会存储类当前的所有属性状态,仅会保存类所属的模块名、类的名称两个标识信息
  • 执行pickle.loads()反序列化时,不会创建全新的类对象,而是直接到对应模块中查找当前已存在的同名类,返回该类对象的引用

2. 测试结果的直接解释

你序列化类T后修改了原类的version属性,反序列化阶段pickle直接返回了当前内存中已经被修改过的T类的引用,因此:

  • PT和T是完全相同的类对象,自然id(PT) == id(T)返回True
  • 两者是同一个对象的不同别名,所以PT.version读取到的就是修改后的2.0,而非序列化时的1.0

3. Python类对象的单例特性

在同一个进程的同一模块作用域下,同名类默认就是唯一的类对象,正常定义、导入、反序列化得到的同名类都是同一个对象的引用,表现和单例一致。只有手动通过type动态生成新类、使用元类创建、或者深度拷贝类对象时,才会生成独立的新类对象。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:06:07