Неправильный вывод функции python

def generatePaths():
    p = [0,0,0,0,0,0,0,0]
    r = []

    p[-1] += 1 # Увеличиваем последний элемент массива на 1
    r.append(p)# Добавляем этот массив к r
    p[-1] += 1 # Увеличиваем последний элемент массива на 1
    r.append(p)# Добавляем этот массив к r

    return r

Вывод получается:

[[0, 0, 0, 0, 0, 0, 0, 2], [0, 0, 0, 0, 0, 0, 0, 2]]

Почему так?


Ответы (2 шт):

Автор решения: CrazyElf

Потому что это один и тот же список p два раза лежит внутри списка r. Т.е. фактически у вас список r выглядит так:

r = [p, p]

Когда вы меняете список p, эти изменения отражаются в том, что вы видите в списке r (два раза).

Хотите, чтобы эти вложенные в r списки стали независимыми (разными) списками - делайте копию списка:

r.append(p.copy())

Хотя это поможет только с одномерными списками. Если там будет больше вложенность, то копировать нужно будет с помощью deepcopy.

→ Ссылка
Автор решения: Илья Коровин

Ссылка на список p совпадает с ссылкой на список r. Вам потребуется сделать копию списка для созданий новой ссылки на память.

→ Ссылка