В python, когда мы назначаем объекты, такие как list, tuples, dict и т. д. другому объекту, обычно с знаком '=', python создает копию по ссылке. То есть, скажем, у нас есть список таких списков:
list1 = [ [ 'a' , 'b' , 'c' ] , [ 'd' , 'e' , 'f' ] ]
, и мы назначаем другой список этому списку, например:
list2 = list1
, затем, если мы напечатаем list2 в python, мы получим следующее:
list2 = [ [ 'a', 'b', 'c'] , [ 'd', 'e', ' f '] ]
Оба списка1 & amp; list2 указывают на то же место в памяти, любое изменение на любое из них приведет к изменениям, видимым в обоих объектах, т. е. оба объекта указывают на то же место в памяти. Если мы изменим list1 следующим образом:
list1[0][0] = 'x’
list1.append( [ 'g'] )
, то как list1, так и list2 будут:
list1 = [ [ 'x', 'b', 'c'] , [ 'd', 'e', ' f '] , [ 'g'] ]
list2 = [ [ 'x', 'b', 'c'] , [ 'd', 'e', ' f '] , [ 'g’ ] ]
Теперь переход к неглубокой копии, когда два объекта копируются по мелкой копии, дочерний объект обоих родительских объектов относится к той же ячейке памяти, но любые новые изменения в любом из скопированных объектов будут независимыми друг от друга. Давайте рассмотрим это с помощью небольшого примера. Предположим, что у нас есть этот небольшой фрагмент кода:
import copy
list1 = [ [ 'a', 'b', 'c'] , [ 'd', 'e', ' f '] ] # assigning a list
list2 = copy.copy(list1) # shallow copy is done using copy function of copy module
list1.append ( [ 'g', 'h', 'i'] ) # appending another list to list1
print list1
list1 = [ [ 'a', 'b', 'c'] , [ 'd', 'e', ' f '] , [ 'g', 'h', 'i'] ]
list2 = [ [ 'a', 'b', 'c'] , [ 'd', 'e', ' f '] ]
уведомление, list2 остается незатронутым, но если мы вносите изменения в дочерние объекты, такие как:
list1[0][0] = 'x’
, тогда как list1, так и list2 будут получить изменение:
list1 = [ [ 'x', 'b', 'c'] , [ 'd', 'e', ' f '] , [ 'g', 'h', 'i'] ]
list2 = [ [ 'x', 'b', 'c'] , [ 'd', 'e', ' f '] ]
Теперь, Deep copy помогает в создании полностью изолированных объектов друг от друга. Если два объекта копируются через Deep Copy, то оба родителя & amp; это ребенок будет указывать на другое место памяти. Пример:
import copy
list1 = [ [ 'a', 'b', 'c'] , [ 'd', 'e', ' f '] ] # assigning a list
list2 = deepcopy.copy(list1) # deep copy is done using deepcopy function of copy module
list1.append ( [ 'g', 'h', 'i'] ) # appending another list to list1
print list1
list1 = [ [ 'a', 'b', 'c'] , [ 'd', 'e', ' f '] , [ 'g', 'h', 'i'] ]
list2 = [ [ 'a', 'b', 'c'] , [ 'd', 'e', ' f '] ]
уведомление, list2 остается незатронутым, но если мы вносите изменения в дочерние объекты, такие как:
list1[0][0] = 'x’
, тогда также list2 не будет затронут как все дочерние объекты и родительский объект указывает на другую ячейку памяти:
list1 = [ [ 'x', 'b', 'c'] , [ 'd', 'e', ' f '] , [ 'g', 'h', 'i'] ]
list2 = [ [ 'a', 'b', 'c'] , [ 'd', 'e', ' f ' ] ]
Надеюсь, что это поможет.