копіювати в 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?
Глибока копія створює новий складений об’єкт перед рекурсивним вставленням копій елементів, знайдених в оригіналі. Це означає спочатку створення нового об’єкта колекції, а потім рекурсивне заповнення його копіями дочірніх об’єктів, знайдених в оригіналі. У разі глибокого копіювання копія об’єкта копіюється в інший об’єкт. Це означає, що будь-які зміни зроблено на копію об'єкта не відображаються в оригінальному об’єкті.
приклад:
У наведеному вище прикладі зміна внесена в список не вплинуло інші списки, вказуючи на те, що список глибоко скопійований.
Цей код ілюструє глибоке копіювання списку з вкладеними елементами за допомогою 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 це реалізовано за допомогою копіювати() функція.
приклад:
У цьому прикладі зміна внесена в список вплинуло інший список, що вказує на те, що список скопійовано поверхнево. Важливі моменти: Різниця між поверхневим і глибоким копіюванням актуальна лише для складених об’єктів (об’єктів, які містять інші об’єкти, наприклад списки чи екземпляри класу):
- Неглибока копія створює новий складений об’єкт, а потім (наскільки це можливо) вставляє в нього посилання на об’єкти, знайдені в оригіналі.
- Глибока копія створює новий складений об’єкт, а потім рекурсивно вставляє в нього копії об’єктів, знайдених в оригіналі.
приклад: Цей код демонструє неглибоке копіювання списку з вкладеними елементами за допомогою ' 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 копією класу