различия copy и deepcopy
В чем заключаются различия между copy и deepcopy в питоне. Везде говорят, что из-за того, что copy, в отличие от deepcopy, копирует ссылки на объекты, а не их копии, какое то изменение во втором объекте влечет за собой изменения в первом. То есть, например, если у нас есть список a = [1, 2, 3], и мы сделаем его copy, получится такой же список b = [1, 2, 3]. Но если изменить что-то в b, то оно изменится и в а, т. е., если, к примеру, b[0] = 2. То получится b = [2, 2, 3], и a = [2, 2, 3], т. к. b содержит именно ссылки на объекты. А deepcopy как-бы развязывает эти 2 списка. То есть, если b[0] = 2, то b = [2, 2, 3], но a = [1, 2, 3], т. к. b содержит именно копии, а не ссылки. Так вот я сейчас проверил эти гипотезы, и вышло, что и в случае copy, и в случае deepcopy изменения в b, не влекут за собой изменения в a, хотя везде говорят, что и a должен измениться, ведь он содержит ссылки объекта a. Так в чем-же все таки различия между copy и deepcopy в питоне. Заранее спасибо!
Ответы (1 шт):
Просто гляньте на эти пару примеров, все станет понятно.
>>> a = [1,2,3]
>>> b = a
>>> b[0] = 5
>>> a, b
([5, 2, 3], [5, 2, 3])
>>> a = [1,2,3]
>>> b = a.copy()
>>> b[0] = 5
>>> a, b
([1, 2, 3], [5, 2, 3])
>>> a = [1,2,[3,4,5]]
>>> b = a.copy()
>>> b[2][0] = 10
>>> a, b
([1, 2, [10, 4, 5]], [1, 2, [10, 4, 5]])
>>> from copy import deepcopy
>>> a = [1,2,[3,4,5]]
>>> b = deepcopy(a)
>>> b[2][0] = 10
>>> a, b
([1, 2, [3, 4, 5]], [1, 2, [10, 4, 5]])