类中的列表不会转储到fi

2024-10-01 04:56:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我做错什么了吗

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()
[]
>>> 

Tags: self程序列表closedefopenstudentpickle
2条回答

s1marks是一个类属性,而不是正在酸洗的实例的属性。在pickle实例时,没有pickle类属性,只有实例属性。因此,当您取消勾选它时,您只会得到实例属性。这意味着类属性被生成/初始化(在本例中为空列表)

您应该了解pythondocs中的实例与类属性

解决这个问题的一个简单方法是在类的__init__函数中初始化列表,而不是在静态作用域上

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

这是因为您创建了student.s1marks作为类属性而不是实例属性。Pickle只记录实例属性

进行此更改:

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

相关问题 更多 >