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

pickle反序列化后存储pd.DataFrame列表的容器类返回空列表问题

问题根源与解决方案

问题原因

你的容器类中l是类属性,而非实例属性。类属性由所有类实例共享,pickle序列化对象时不会保存类属性的当前状态(因为它属于类本身,不是单个实例的私有数据):

  • 同一脚本内连续执行保存和加载时,当前会话中类的l还保留着添加的数据,所以加载后能正常显示;
  • 单独执行加载操作时,新会话里类的l是初始的空列表,反序列化后的实例依然指向这个类属性,因此显示为空。

修复代码

将l改为实例属性,在类的__init__方法中初始化:

import pandas as pd
import pickle

data1 = [[12.0, 13.1], [14.0, 15.0]]
data2 = [[24.0, 25.1], [26.0, 27.0]]

df1 = pd.DataFrame(data1, columns=["T11", "T12"])
df2 = pd.DataFrame(data2, columns=["T11", "T12"])

class container():
    def __init__(self):
        self.l = []  # 定义为实例属性,每个实例独立拥有

    def append_l(self, df):
        self.l.append(df)

# 实例化并保存(单独加载时可注释此段)
device = container()
device.append_l(df1)
device.append_l(df2)

with open("save.pkl", "wb") as outfile:
    pickle.dump(device, outfile)

# 加载操作
with open("save.pkl", "rb") as infile:
    loaded = pickle.load(infile)

print(loaded.l)

修复说明

把l移到__init__中作为实例属性后,每个container实例都会拥有自己独立的列表。此时pickle会正确序列化实例的私有数据,单独执行加载操作时,反序列化得到的实例会携带保存时的完整列表内容,不会再指向空的类属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:12:51