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

li = [1]
li2= []

for _ in range(2):
    li2.append(li)
    li += [3]
print(spisok)

[[1, 3, 3], [1, 3, 3]]

Если в цикле список li2 добавляет список li в том же цикле, при этом список li добавляется как-будто прошел весь цикл. Не понимаю, тогда как добавлять последовательно изменяемый список в цикле


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

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

Список хранит ссылки на объекты (на самом деле все переменные хранят ссылки на объекты). Вы в цикле добавляете в список ссылку на один и тот же объект, и в этот же объект добавляете элементы.

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

li = [1]
li2= []

for _ in range(2):
    li2.append(li.copy())
    li += [3]

print(li2)

Вывод:

[[1], [1, 3]]

При добавлении объектов большей вложенности также может потребоваться "глубокая" копия:

from copy import deepcopy

li = [[1]]
li2= []

for _ in range(2):
    li2.append(deepcopy(li))
    li[0] += [3]

print(li2)

Выведет [[[1]], [[1, 3]]], а с обычным копированием (или без копирования) - [[[1, 3, 3]], [[1, 3, 3]]]

→ Ссылка