2017-09-12 140 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列表,你可以使用一个列表切片(答案更新) –