在类中创建我自己的python列表(动态数组)

时间:2017-09-13 14:47:25

标签: python arrays dynamic

我可能有与此处完全相同的问题: Creating dynamic array in class [python] 但我有更多关于帖子帮助者要求的信息:

referential_array包括: import ctypes

def build_array(size):

    if size <= 0:
        raise ValueError("Array size should be larger than 0.")
    if not isinstance(size,  int):
        raise ValueError("Array size should be an integer.")
    array = (size * ctypes.py_object)()
    array[:] = size * [None]
    return array

我尝试调整大小:

来自referential_array import build_array

class Array:

    def __init__(self, size):
        assert size >= 0, "size must be positive"
        self.the_array = build_array(size)
        self.count = 0
        self.size = size


def resize(self):

    if self.isFull():
        self.the_array2 = build_array(self.size*2)
        for i in range(len(self)):
            self.the_array2.append(self[i])
        self.the_array = self.the_array2
        self.size = (self.size)*2    
    elif len(self) < (1/8)*(self.size) and (self.size) >= 40:
        self.the_array2 = build_array((self.size)//2)
        for i in range(len(self)):
            self.the_array2.append(self[i])
        self.the_array = self.the_array2
        self.size = (self.size)//2
    else:
        pass

def __str__(self):
    result = ""
    for i in range(self.count):
        result += str(self.the_array[i])
        result += "\n"
    return result

def __len__(self):
    return self.count

def isEmpty(self):
    return len(self) == 0

def isFull(self):
    return len(self) >= len(self.the_array)

def indexValid(self,index):
    return -len(self) <= index and index < len(self)

def __getitem__(self,index):
    if self.indexValid(index):
        if index >= 0:
            return self.the_array[index]
        else:
            return self.the_array[index+len(self)]
    else:
        raise IndexError("index out of range")


def __setitem__(self,index,item):
    if self.indexValid(index):
        if index >= 0:
            self.the_array[index] = item
        else:
            self.the_array[index+len(self)] = item
    else:
        raise IndexError("index out of range")
def append(self,item):

    if not self.isFull():
        self.the_array[self.count] = item
        self.count += 1

    self.resize()

上面的代码给出了一个&#34; AttributeError:&#39; py_object_Array_40&#39;对象没有属性&#39;追加&#39;&#34;

使用[:]:

尝试两个
def resize(self):

    if self.isFull:
        self.the_array2 = build_array(self.size*2)
        self.the_array2 = self.the_array[:]
        self.the_array = self.the_array2
        self.size = (self.size)*2    
    elif len(self) < (1/8)*(self.size) and (self.size) >= 40:
        self.the_array2 = build_array((self.size)//2)
        self.the_array2 = self.the_array[:]
        self.the_array = self.the_array2
        self.size = (self.size)//2
    else:
        pass

这次我得到了记忆错误。 感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我可能错了,但你确定你的代码缩进了吗?您的所有方法定义都应缩进为:

class Array:

    def __init__(self, size):
        assert size >= 0, "size must be positive"
        self.the_array = build_array(size)
        self.count = 0
        self.size = size


    def resize(self):

        if self.isFull:
            self.the_array2 = build_array(self.size*2)
            for i in range(len(self)):
                self.the_array2.append(self[i])
            self.the_array = self.the_array2
            self.size = (self.size)*2    
        elif len(self) < (1/8)*(self.size) and (self.size) >= 40:
            self.the_array2 = build_array((self.size)//2)
            for i in range(len(self)):
                self.the_array2.append(self[i])
            self.the_array = self.the_array2
            self.size = (self.size)//2
        else:
            pass

如果你没有正确缩进,那么append方法被视为一个适合你的Python模块的函数,而不是一个类方法 - 它可以解释你的第一个错误信息。

答案 1 :(得分:0)

def resize(self):

    if self.isFull: # Fix it to self.isFull()
        self.the_array2 = build_array(self.size*2)
        self.the_array2 = self.the_array[:]
        self.the_array = self.the_array2
        self.size = (self.size)*2    
    elif len(self) < (1/8)*(self.size) and (self.size) >= 40:
        self.the_array2 = build_array((self.size)//2)
        self.the_array2 = self.the_array[:]
        self.the_array = self.the_array2
        self.size = (self.size)//2
    else:
        pass

self.isFull修复为self.isFull ()因为您永远不会进入其他条件。