Добавление списков в список результатов продолжает заменять последний добавленный - PullRequest
1 голос
/ 10 мая 2019

Я хочу добавить список (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 ]

3 голосов
/ 10 мая 2019

arrCopy добавляется в качестве ссылки, что означает указатель на массив в памяти.Если массив в памяти изменяется, он будет отображаться везде, где на него ссылаются.

Вам необходимо сохранить копию массива.Вы можете сделать это следующим образом: result.append(arrCopy[:]) Это создаст новый массив в памяти, на который не влияют изменения в arrCopy

1 голос
/ 10 мая 2019

Вы не «замораживаете» arrCopy при добавлении, поэтому каждый раз, когда вы добавляете список по имени, он меняется по мере изменения результата.

Попробуйте импортировать модуль копирования и использовать глубокую копию, как я это сделал.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...