import copy
a = [[1], [2]]
b = copy.deepcopy(a)
b[0].append(3)
print(a)
[[1], [2]].
  copy.deepcopy() создает полную копию объекта.  В данном случае, b является независимой копией a, поэтому изменения в b не влияют на a. Даже несмотря на то, что вложенные списки, содержащиеся в основном списке, также копируются, добавление элемента в один из этих списков в b не затронет оригинальный список a.
Данный код демонстрирует разницу между поверхностным и глубоким копированием списков в Python, особенно когда эти списки содержат вложенные изменяемые объекты, такие как другие списки.
Исходный код:
import copy
a = [[1], [2]]
b = copy.deepcopy(a)
b[0].append(3)
print(a)
  Разберем код построчно:
import copy: Импортирует модуль copy, который предоставляет функции для создания копий объектов.a = [[1], [2]]: Создает список a, содержащий два вложенных списка: [1] и [2].b = copy.deepcopy(a): Создает глубокую копию списка a и присваивает ее переменной b.  Глубокое копирование создает совершенно новые объекты для каждого элемента, вложенного в исходный список. В данном случае, создаются новые списки для [1] и [2].b[0].append(3): Добавляет элемент 3 в первый вложенный список списка b (то есть, в список b[0]).  Важно понимать, что это изменение происходит только в списке b.print(a): Выводит на экран значение списка a.Результат выполнения:
[[1], [2]]Объяснение результата:
Поскольку была использована функция copy.deepcopy(), список b стал полностью независимой копией списка a.  Изменение b[0] не влияет на a[0]. Если бы использовалось поверхностное копирование (например, b = a[:] или b = list(a)), то  a[0] и b[0] указывали бы на один и тот же объект в памяти.  В этом случае, изменение b[0] привело бы и к изменению a[0].
Ключевые моменты:
copy.deepcopy()): Создает полностью независимые копии объектов, включая все вложенные объекты.