копіювати в Python (глибоке копіювання та неглибоке копіювання)

копіювати в Python (глибоке копіювання та неглибоке копіювання)

в Python , Інструкції присвоєння не копіюють об’єкти, вони створюють зв’язки між метою та об’єктом. Коли ми використовуємо = Він лише створює нову змінну, яка ділиться посиланням на оригінальний об’єкт. Щоб створити реальні копії або клони цих об’єктів, ми можемо використовувати модуль копіювання в Python .

Синтаксис Python Deepcopy

Синтаксис: copy.deepcopy(x)

Синтаксис Python Shallowcopy

Синтаксис: copy.copy(x)

приклад:

Щоб зробити ці копії, ми використовуємо модуль копіювання. Копія() повертає поверхневу копію списку, а deepcopy() повертає глибоку копію списку. Як бачите, обидва мають однакове значення, але різні ідентифікатори.

приклад: Цей код демонструє використання copy> модуль для створення як поверхневих, так і глибоких копій вкладеного списку li1> . Дрібна копія, li2> , створюється за допомогою copy.copy()> , зі збереженням структури верхнього рівня, але спільним використанням посилань на внутрішні списки. Глибока копія, li3> , створюється за допомогою copy.deepcopy()> , в результаті чого вийшла повністю незалежна копія li1> , включаючи всі вкладені елементи. Код друкує ідентифікатори та значення li2> і li3> , підкреслюючи різницю між поверхневими та глибокими копіями з точки зору посилання та незалежності.

Python3




import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.copy(li1)> print> (> 'li2 ID: '> ,> id> (li2),> 'Value: '> , li2)> li3> => copy.deepcopy(li1)> print> (> 'li3 ID: '> ,> id> (li3),> 'Value: '> , li3)>

Вихід:

  li2 ID:   2521878674624   Value:   [1, 2, [3, 5], 4]   li3 ID:   2521878676160   Value:   [1, 2, [3, 5], 4] 

Що таке глибока копія в Python?

Глибока копія створює новий складений об’єкт перед рекурсивним вставленням копій елементів, знайдених в оригіналі. Це означає спочатку створення нового об’єкта колекції, а потім рекурсивне заповнення його копіями дочірніх об’єктів, знайдених в оригіналі. У разі глибокого копіювання копія об’єкта копіюється в інший об’єкт. Це означає, що будь-які зміни зроблено на копію об'єкта не відображаються в оригінальному об’єкті.

Глибока копія в Python

приклад:

У наведеному вище прикладі зміна внесена в список не вплинуло інші списки, вказуючи на те, що список глибоко скопійований.

Цей код ілюструє глибоке копіювання списку з вкладеними елементами за допомогою copy> модуль. Спочатку він друкує оригінальні елементи li1> , потім глибоко копіює їх для створення li2> . Модифікація елемента в li2> не впливає li1> , як показано на окремих роздруківках. Це підкреслює, як глибоке копіювання створює незалежну копію, зберігаючи вміст оригінального списку навіть після внесення змін до копії.

Python3




import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.deepcopy(li1)> print> (> 'The original elements before deep copying'> )> for> i> in> range> (> 0> ,> len> (li1)):> > print> (li1[i],end> => ' '> )> print> (> ' '> )> li2[> 2> ][> 0> ]> => 7> print> (> 'The new list of elements after deep copying '> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li2[i],end> => ' '> )> print> (> ' '> )> print> (> 'The original elements after deep copying'> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li1[i],end> => ' '> )>

Вихід:

The original elements before deep copying 1 2 [3, 5] 4 The new list of elements after deep copying 1 2 [7, 5] 4 The original elements after deep copying 1 2 [3, 5] 4 

Що таке дрібна копія в Python?

Неглибока копія створює новий складений об’єкт, а потім посилається на об’єкти, що містяться в оригіналі в ньому, що означає, що вона створює новий об’єкт колекції, а потім заповнює його посиланнями на дочірні об’єкти, знайдені в оригіналі. Процес копіювання не рекурсивний і тому не створює копій самих дочірніх об’єктів. У випадку мілкого копіювання посилання на об’єкт копіюється в інший об’єкт. Це означає, що будь-які зміни створено для копії об’єкта відображати в оригінальному об'єкті. У Python це реалізовано за допомогою копіювати() функція.

Неглибока копія в Python

приклад:

У цьому прикладі зміна внесена в список вплинуло інший список, що вказує на те, що список скопійовано поверхнево. Важливі моменти: Різниця між поверхневим і глибоким копіюванням актуальна лише для складених об’єктів (об’єктів, які містять інші об’єкти, наприклад списки чи екземпляри класу):

  • Неглибока копія створює новий складений об’єкт, а потім (наскільки це можливо) вставляє в нього посилання на об’єкти, знайдені в оригіналі.
  • Глибока копія створює новий складений об’єкт, а потім рекурсивно вставляє в нього копії об’єктів, знайдених в оригіналі.

приклад: Цей код демонструє неглибоке копіювання списку з вкладеними елементами за допомогою ' copy'> модуль. Спочатку він друкує оригінальні елементи li1> , потім виконує неглибоке копіювання в li2> . Зміна елемента в li2> впливає на відповідний елемент в li1,> оскільки обидва списки мають спільні посилання на внутрішні списки. Це ілюструє, що поверхневе копіювання створює новий список, але воно не забезпечує повної незалежності для вкладених елементів.

Python3




import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.copy(li1)> print> (> 'The original elements before shallow copying'> )> for> i> in> range> (> 0> ,> len> (li1)):> > print> (li1[i],end> => ' '> )> print> (> ' '> )> li2[> 2> ][> 0> ]> => 7> print> (> 'The original elements after shallow copying'> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li1[i],end> => ' '> )>

Вихід:

The original elements before shallow copying 1 2 [3, 5] 4 The original elements after shallow copying 1 2 [7, 5] 4 

РЕКОМЕНДОВАНІ СТАТТІ Різниця між Shallow і Deep копією класу