2015-11-01 15 views
2

當我轉儲文件中的列表並重新啓動程序並嘗試檢索它時,它會返回一個空列表。在一個類中列出不是傾銷到文件

我做錯了什麼?

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

這是因爲你已經創建student.s1marks作爲一個類的屬性,而不是一個實例屬性。 Pickle只記錄實例屬性。

進行此更改:

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

對於那些可能會感到疑惑變通,閱讀doc [什麼可以被醃漬和取消?](https://docs.python.org/2/library/pickle.html#what-c​​an-be-pickled-and-unpickled) –

1

s1marks是一個類屬性,而不是你爲酸洗實例的屬性。當你醃製實例時,你還沒有醃製類屬性,只是實例屬性。所以當你取消它時,你只會返回實例屬性。這意味着類的屬性生成/初始化,然後(在這種情況下,空列表)

與類在Python docs

對此的一種簡單的方法是初始化屬性列表,你應該閱讀有關實例在類的__init__函數中,而不是在靜態作用域上。

另一種方法是更改​​爲不可變的屬性您分配之後(如將其轉換爲一個元組),但這是不太推薦