当我将列表转储到文件中并重新启动程序并尝试检索它时,它会返回一个空列表。
我做错了吗?
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()
[]
>>>
答案 0 :(得分:2)
这是因为您已将student.s1marks
创建为类属性而非实例属性。 Pickle仅记录实例属性。
进行此更改:
class student():
def __init__(self):
self.s1marks=[]
# ... and the rest unchanged
答案 1 :(得分:1)
s1marks是一个类属性,而不是您正在挑选的实例的属性。当你腌制实例时,你还没有腌制类属性,只有实例属性。因此,当你取消它时,你只会得到实例属性。这意味着生成/初始化类属性(在这种情况下为空列表)
您应该阅读python docs
中的实例与类属性一个简单的方法是初始化类的__init__
函数中的列表,而不是静态范围。
另一种方法是在分配属性后将属性更改为不可变(例如将其转换为元组),但这是一种不太推荐的解决方法