将列表追加到结果列表会不断替换最后一个追加的列表

时间:2019-05-09 22:07:54

标签: python sorting

我想将列表(arrCopy)附加到列表列表(结果)。但是对于每个append,当前列表将替换前一个列表,因此列表列表仅具有当前列表。

def insertionSort1(n, arr):
    arrCopy = arr[:]
    last = arr[-1]
    result = []

    for ind, num in enumerate(reversed(arr[:-1])):

        print('ind',ind, 'num',num, 'arrCopy', arrCopy, 'result',result)

        if num>=last:
            arrCopy[len(arr)-1-ind] = num
            result.append(arrCopy)
        else:
            arrCopy[len(arr)-1-ind] = last
            result.append(arrCopy)
            break

    print(result)

    for nums in result: 
        print(' '.join(str(n) for n in nums))

insertionSort1(5, [2, 4, 6, 8, 3])

2 个答案:

答案 0 :(得分:3)

arrCopy附加为引用,表示指向内存中数组的指针。如果内存中的数组发生更改,它将在被引用的所有位置显示。

您需要存储阵列的副本。您可以这样做: result.append(arrCopy[:])这将在内存中创建一个不受arrCopy更改影响的新数组

答案 1 :(得分:1)

追加时您不会“冻结” arrCopy,因此每次按名称添加列表时,列表都会随着结果的变化而变化。

尝试导入复制模块并像我一样使用Deepcopy。

import copy

def insertionSort1(n, arr):
    arrCopy = copy.deepcopy(arr[:])
    last = arr[-1]
    result = []
for ind, num in enumerate(reversed(arr[:-1])):


    print('ind',ind, 'num',num, 'arrCopy', arrCopy, 'result',result)
    if num>=last:
        arrCopy[len(arr)-1-ind]=num
        result.append(copy.deepcopy(arrCopy))
    else:
        arrCopy[len(arr)-1-ind]=last
        result.append(copy.deepcopy(arrCopy))
        break

print(result)

for nums in result:
    print(' '.join(str(n) for n in nums))

def main():
    insertionSort1(5, [2, 4, 6, 8, 3])

if __name__ == '__main__':
    main()