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()
): Создает полностью независимые копии объектов, включая все вложенные объекты.