当程序再次运行时,Python pickle加载不起作用

时间:2013-11-30 15:50:54

标签: python pickle

我正在尝试使用pickle存储包含一个变量的类实例。

class Scm1:
  keys = {'b':0, 'i':0, 's':0}

我在程序中做的第一件事就是检查pickle文件是否存在。如果是,我尝试使用pickle load加载数据。如果没有(这只在程序第一次运行时发生),我创建了这个类t1 = Scm1()t2 = Scm1()的两个实例。然后,在我的程序中,我修改了keys字段中的条目。最后,我尝试将实例存储到文件中。为此,我将两个实例添加到字典 - tmpDict = {'t1':t1, 't2':t2}并使用tmpDict作为对象执行pickle转储。当我在转储后立即使用pickle加载数据时,我得到了我期望的结果(数据设置为程序期间的数据)。但是,当我再次运行程序(这次文件存在)并加载数据时,两个对象(t1和t2)的键字段中的所有条目都是0.为什么当我能够获得当我在程序结束之前进行pickle加载而不是在我重新运行程序时再次加载时,结果是正确的。我是python的新手,所以我不确定我是否期望泡菜以正确的方式工作。很抱歉无法为学校作业粘贴更多代码段。

1 个答案:

答案 0 :(得分:3)

class Scm1:
    keys = {'b':0, 'i':0, 's':0}

keys是一个类变量,因此该类的所有实例都共享它。存储实例时不会对类变量进行pickle,因为它们不属于实例。

您应该使用实例属性:

class Scm1:
    def __init__(self):
        self.keys = {'b':0, 'i':0, 's':0}