当我在文件中转储列表并重新启动程序并尝试检索它时,它返回一个空列表
我做错什么了吗
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()
[]
>>>
s1marks是一个类属性,而不是正在酸洗的实例的属性。在pickle实例时,没有pickle类属性,只有实例属性。因此,当您取消勾选它时,您只会得到实例属性。这意味着类属性被生成/初始化(在本例中为空列表)
您应该了解pythondocs中的实例与类属性
解决这个问题的一个简单方法是在类的
__init__
函数中初始化列表,而不是在静态作用域上另一种方法是在分配属性后将其更改为不可变的(例如将其转换为元组),但这是一种不太推荐的解决方法
这是因为您创建了
student.s1marks
作为类属性而不是实例属性。Pickle只记录实例属性进行此更改:
相关问题 更多 >
编程相关推荐