В следующем коде Python я создал список a, который содержит несколько списков, а затем создал его копию b, но в отличие от списков, которые не содержат других списков, при изменении b соответственно изменяется и a. Может кто-нибудь объяснить, как предотвратить это, кроме как путем копирования каждого списка отдельно?
a = [[None, None, None], [None, None, None], [None, None, None]]
b=a[:]
b[0][0] = 5
a
[[5, None, None], [None, None, None], [None, None, None]]
Срез создает новый список, но содержимое списка не копируется. Итак, a[:]
дает вам новый список, но содержимое этого нового списка b
по-прежнему является ссылками на те же списки, на которые ссылается a
.
Если вы попробуете b[0]=[]
, вы сможете сказать, что можете изменить b
, не меняя a
, но b[0][0]
просто изменяет первый элемент первого списка в b
, который также является первым элементом первого списка в a
.
b
является поверхностной копией a
(проверьте значения id(a[0])
и id(b[0])
, они будут одинаковыми, даже если id(a)
!= id(b)
). Вам также нужно позаботиться об элементах внутри списка (если они изменяемы и изменены, неглубокая копия будет отражать изменения в обоих местах). Вы можете сделать что-то подобное, чтобы создать копию deep
:
import copy
b = copy.deepcopy(a)
Прочтите операции поверхностного и глубокого копирования в Python.