Срез [1:] выводит разные результаты в разных местах, один результат внутри функции, другой результат вне функции, почему?

Почему в разных местах программы срез [1:] выводит разные результаты? Противоречит здравому смыслу и тому, как работают срезы

Код

def pathfind(l):
    if len(l) == 1:
        return sum(l[0])
    if len(l[0]) == 1:
        s = 0
        for i in range(len(l)):
            s += l[i][0]
        return s
    l1 = l[1:] # выдаёт [[2]] (?!)
    l2 = l.copy()
    for i in range(len(l2)):
        l2[i].pop(0)
    print(l1)
    return l[0][0] + min(pathfind(l1), pathfind(l2))


n, m = map(int, input().split())
l = [list(map(int, input().split())) for i in range(n)]
print(l[1:]) # выдаёт [[1,2]]
print(pathfind(l))

При списке данных [[1,3],[1,2]] вне функции выдаёт [[1,2]], внутри функции - [[2]]


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

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

Вы тут копируете только верхний уровень списков, т.е. получаете копии ссылок на более глубокие списки, которые остаются одними и теми же для l, l1, l2:

l1 = l[1:]
l2 = l.copy()

А тут вы казалось бы удалили элементы только из вложенных списков списка l2, но нет - на самом деле вы удалили элементы из вложенных списков, на которые указывают все три переменные, по причинам, описанным выше:

for i in range(len(l2)):
    print(l2, i, l2[i])
    l2[i].pop(0)

Хотите получить полные/глубокие копии списков, не зависящие друг от друга - используйте deepcopy:

from copy import deepcopy
...
    l1 = deepcopy(l[1:])
    l2 = deepcopy(l)
→ Ссылка