Списки в цикле странно себя ведут при добавлении
li = [1]
li2= []
for _ in range(2):
li2.append(li)
li += [3]
print(spisok)
[[1, 3, 3], [1, 3, 3]]
Если в цикле список li2 добавляет список li в том же цикле, при этом список li добавляется как-будто прошел весь цикл. Не понимаю, тогда как добавлять последовательно изменяемый список в цикле
Ответы (1 шт):
Список хранит ссылки на объекты (на самом деле все переменные хранят ссылки на объекты). Вы в цикле добавляете в список ссылку на один и тот же объект, и в этот же объект добавляете элементы.
Если нужно чтобы в списке были разные объекты, не связанные друг с другом, нужно делать копию объекта перед добавлением:
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]]]