追加到数组时更新旧条目的Python字典

w1e3prcc  于 2023-02-02  发布在  Python
关注(0)|答案(1)|浏览(120)

我研究这个问题已经很久了。我正在编写代码,使用已知的算法来增加ArrayList的大小,因为我正在向它添加内容。每次ArrayList的大小发生变化时,我都会将新的大小添加到一个数组中,然后将该数组添加到字典中。
下面是我正在使用的ArrayList类的代码

class ArrayList:
def __init__(self, growfn):
    '''Initializes the empty ArrayList with the specified growth function.'''
    self.size = 0
    self.used = 0
    self.array = []
    self.grow = growfn

def get(self, index):
    if index < self.size:
        return self.array[index]
    # exception handling
    return None

def add(self, value):
    if self.used == self.size:
        newSize = self.grow(self.size)
        if newSize <= self.size:
            # exception handling
            return
        newArray = self.array[:]+[None for i in range(self.size,newSize)]
        self.array = newArray
        self.size = newSize
    self.array[self.used] = value
    self.used = self.used + 1
    return None

下面是我编写的测试代码,这个函数有3个参数:一个列表,包含数组的最大大小、用于增加ArrayList大小的算法的函数以及它将运行的尝试次数。

def analyzePerformance(nList, gfn, tries):
data = []
sizes_array = []
averages = []
arr = ArrayList(gfn)
for num in nList:
    for j in range(tries):
        current_size = 0
        start = time()
        while arr.size < num:
            arr.add(None)
            if arr.size != current_size:
                sizes_array.append(arr.size)
                current_size = arr.size
        end = time()
        averages.append(end - start)
    data.append(dict({'grow': gfn, 'N': num, 'seconds': mean(averages), 'sizes': sizes_array})) 
return data

最后是调用函数的代码

def main():
for result in analyzePerformance([1,10,100], double, 11):
    print(result)

double是一个简单地将数组的大小加倍的函数
以下是我当前的输出:

{'grow': <function double at 0x7f3274eb4f28>, 'N': 1, 'seconds': 3.034418279474432e-07, 'sizes': [1, 2, 4, 8, 16, 32, 64, 128]}
{'grow': <function double at 0x7f3274eb4f28>, 'N': 10, 'seconds': 4.659999500621449e-07, 'sizes': [1, 2, 4, 8, 16, 32, 64, 128]}
{'grow': <function double at 0x7f3274eb4f28>, 'N': 100, 'seconds': 7.369301535866477e-07, 'sizes': [1, 2, 4, 8, 16, 32, 64, 128]}

下面是我需要的输出

{'grow': <function double at 0x7f3274eb4f28>, 'N': 1, 'seconds': 3.034418279474432e-07, 'sizes': [1]}
{'grow': <function double at 0x7f3274eb4f28>, 'N': 10, 'seconds': 4.659999500621449e-07, 'sizes': [1, 2, 4, 8, 16]}
{'grow': <function double at 0x7f3274eb4f28>, 'N': 100, 'seconds': 7.369301535866477e-07, 'sizes': [1, 2, 4, 8, 16, 32, 64, 128]}

为什么当我用不同长度的sizes数组向字典中添加新元素时,它会更新旧的字典,使其也具有更长的数组?任何帮助都是感激的,谢谢!

lf5gs5x2

lf5gs5x21#

您可能需要查看Shallow and deep copy operations
Python中的赋值语句并不复制对象,而是在目标和对象之间创建绑定。对于可变的或包含可变项的集合,有时需要一个副本,这样就可以更改一个副本而不更改另一个副本。
对于下一段代码,sizes_array将在不同的迭代中重用,尽管它已经被添加到data list中:

data.append(dict({'grow': gfn, 'N': num, 'seconds': mean(averages), 'sizes': sizes_array}))

要解决此问题,您需要将above更改为next:

data.append(dict({'grow': gfn, 'N': num, 'seconds': mean(averages), 'sizes': sizes_array.copy()}))

使用上面的命令,您将看到符合您要求的sizes_array的复制对象。

相关问题