различия 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]])
→ Ссылка