Список Python добавляет разные списки в одной области для одной и той же переменной - PullRequest
0 голосов
/ 30 мая 2019

Хорошо. Я пишу алгоритм, чтобы показать мне все перестановки в списке целых чисел. Но во время выполнения алгоритма у меня возникла проблема с добавлением перестановочного списка в мой список результатов.

Код - это алгоритм кучи. Я получил законченную перестановку, когда size == 1. Таким образом, я могу добавить переставленный список V в мой окончательный список res. Вот код:

Функция для перестановки списка

def permutations(V, size):
    global res

    if size == 1:
        print(V)
        res.append(V)

    for i in range(0, size):
        permutations(V, size-1)

        if size % 2 == 1:
            V[size-1], V[0] = V[0], V[size-1]
        else:
            V[i], V[size-1] = V[size-1], V[i]

A = [1,2,3]
res = []
permutation(A, len(A))
print(res)

И это вывод:

[1, 2, 3]
[2, 1, 3]
[3, 1, 2]
[1, 3, 2]
[2, 3, 1]
[3, 2, 1]
res: [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

Печатные перестановки V верны. Но список V, добавленный к моему global res, не изменился. Они добавляются сразу после печати, а список добавляется иначе.

Если вы измените строки следующим образом:

res.append(V)
  |
  |
  v      
D = [V[i] for i in range(len(V))]
res.append(D)

Результаты верны в финале. Любой человек может объяснить, как распечатанный список может отличаться от добавленного списка с помощью той же переменной.

1 Ответ

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

Заменить res.append(V) на res.append(list(V)) просто исправит вашу проблему.

Все V, добавленные вами к res, являются ссылками на один и тот же объект. Это можно увидеть, напечатав идентификатор каждого элемента в списке:

for i in res:
    print(id(i))
...