类中的列表不会转储到文件中

时间:2015-11-01 06:12:45

标签: python list class object append

当我将列表转储到文件中并重新启动程序并尝试检索它时,它会返回一个空列表。

我做错了吗?

import pickle
class student():
    s1marks=[]
    def getdata(self):
        for i in range(20):
            self.s1marks.append(i)
    def outdata(self):
        print self.s1marks

def einput():
    f=open('student1.dat','ab')
    e=student()
    e.getdata()
    pickle.dump(e,f)
    f.close()
def edisplay():
    f=open('student1.dat','rb')
    try:
        while True:
            e=pickle.load(f)
            e.outdata()
    except EOFError:
        pass
    f.close()

运行程序。

>>> einput()
>>> edisplay()
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> 

重新启动程序并运行显示功能

>>> edisplay()
[]
>>> 

2 个答案:

答案 0 :(得分:2)

这是因为您已将student.s1marks创建为类属性而非实例属性。 Pickle仅记录实例属性。

进行此更改:

class student():
    def __init__(self):
        self.s1marks=[]
    # ... and the rest unchanged

答案 1 :(得分:1)

s1marks是一个类属性,而不是您正在挑选的实例的属性。当你腌制实例时,你还没有腌制类属性,只有实例属性。因此,当你取消它时,你只会得到实例属性。这意味着生成/初始化类属性(在这种情况下为空列表)

您应该阅读python docs

中的实例与类属性

一个简单的方法是初始化类的__init__函数中的列表,而不是静态范围。

另一种方法是在分配属性后将属性更改为不可变(例如将其转换为元组),但这是一种不太推荐的解决方法