2017-09-12 61 views
0

我寫了自己的List類,它包裝了另一個類似list的數組類型。陣列具有固定容量,當陣列滿時,我希望容量自動加倍。例如,如果我的基本容量是5,那麼當數組已滿並且添加另一個項目時,在添加項目之前,它將容量加倍爲10。在類[python]中創建動態數組

這裏是我的代碼:

from referential_array import build_array 

class List: 

    def __init__(self,capacity): 
     assert capacity >0, "Capacity cannot be negative" 
     self.count = 0 
     self._array = build_array(capacity) 
     self.capacity = capacity 

    def append(self,item): 
     has_space_left = not self.is_full() 
     if has_space_left: 
      self._array[self.count] = item 
      self.count+=1 
     else:          #Issue here 
      create_more_space = List.__init__(self,capacity*2) #if list is full, capacity *2 
      self.count+=1 

if __name__== "__main__": 
    myList = List(6) 
    myList.append(4) 
    myList.append(7) 
    myList.append(1) 
    myList.append(3) 
    myList.append(2) 
    myList.append(17) 
    myList.append(18) 
    myList.append(20) 
下面

,第一我指定的大小爲6。然後我繼續追加超過600項以上。右邊,當python看到沒有空間時,容量會翻倍,因此18和20也可以被附加。

我收到一個錯誤,說容量沒有在追加函數中定義。我試圖讓輸出是:

4 
7 
1 
3 
2 
17 
18 
20 
+0

單獨使用'self.capacity'而不是'capacity'。但是我覺得在你的代碼中還有其他問題只是看着它... – Julien

+0

它沒有被定義,因爲你必須通過'self.capacity'來訪問'capacity'。另外,你正在嘗試做的事情是用你附加的所有東西來覆蓋'_array'。 – Unatiel

回答

0

這個錯誤是因爲在Python 對象的成員必須self引用來訪問:

create_more_space = List.__init__(self, self.capacity * 2) 

我不知道爲什麼你正在做這個,因爲內置的python list類型有這個功能,所以我會假設這是爲了學習。在這種情況下,我建議將大小調整爲可以從構造函數調用的單獨方法,並且可以調用append。另外,當前的設置會在容量更改時丟失數組的內容(因爲您將在舊數組的頂部分配一個新數組)。例如

new_array = build_array(capacity) 
new_array[0:len(self._array)] = self._array 
self._array = new_array 
+0

是的,我明白設置將丟失舊數組的內容。我是否必須爲此創建一個新功能?如果是這樣,我如何確保數組不覆蓋舊內容? – Maxxx

+0

很難說如何複製內容,因爲我們不知道'referential_array.build_array'是什麼。如果它的行爲像一個普通的Python列表,你可以使用一個列表切片(答案更新) –