Срез [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 шт):
Вы тут копируете только верхний уровень списков, т.е. получаете копии ссылок на более глубокие списки, которые остаются одними и теми же для 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)