2017-09-12 7 views
0

私は別のlist様配列型をラップ自分Listクラスを書きました。アレイの容量は固定されており、アレイがいっぱいになると容量が自動的に倍増します。たとえば、基本容量が5で、配列がいっぱいで別の項目が追加されると、項目を追加する前に容量が2倍になります。その後、私は6つの項目より追記より先に行く[パイソン]

以下
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で指定します。

は、ここに私のコードです。 Pythonはもはやスペースがあることを認識しない場合、右により、容量が倍増し、従って、18と20は、同様に添付することができるであろう。

私は容量がアペンド機能で定義されていないというエラーを取得しています。私が取得しようとしている出力は、次のとおりです。Pythonの内のオブジェクトのメンバーはself参照からアクセスしなければならないので

4 
7 
1 
3 
2 
17 
18 
20 
+0

「capacity」のみではなく、「self.capacity」を使用します。しかし、私はあなたのコードにそれ以外の問題があると感じています。 – Julien

+0

'self.capacity'を通して' capacity'にアクセスしなければならないので、定義されていません。また、あなたがしようとしていることは '_array'をあなたがそれに追加したもの全てで上書きします。 – Unatiel

答えて

0

エラーは次のとおりです。

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リストのように動作する場合は、リストスライス(答えが更新された) –