Introducere

În acest tutorial, vom discuta despre copii superficiale vs copii profunde cu ajutorul exemplelor din Python. Vom acoperi definiția unei copii profunde și superficiale, împreună cu implementarea acesteia în limbajul Python pentru a evalua diferențele de bază dintre cele două tipuri de copii.

în multe dintre programele pe care le scriem, indiferent cât de de bază sunt, ajungem să avem nevoie să copiem o listă sau un obiect dintr-unul din mai multe motive, cum ar fi eficiența computațională., Există două moduri de a face acest lucru, fie să faceți o copie profundă, fie o copie superficială. Înainte de a discuta diferențele dintre cele două, să înțelegem mai întâi ce copii adânci și superficiale sunt exact.

copii profunde în Python

o copie profundă face o copie nouă și separată a unui întreg obiect sau listă cu propria adresă de memorie unică. Aceasta înseamnă că orice modificări pe care le faceți în noua copie a obiectului/listei nu se vor reflecta în cea originală. Acest proces se întâmplă prin crearea mai întâi a unei noi liste sau a unui obiect, urmată de copierea recursivă a elementelor de la cea originală la cea nouă.,pentru a pune pe scurt, ambele obiecte sunt complet independente una de cealaltă. Acest lucru este similar cu conceptul de trecere prin valoare în limbi precum C++, Java și C#.

exemplu de copiere profundă

pentru a implementa conceptul de copii profunde în Python, vom folosi modulul de copiere.să presupunem că avem o listă de liste numită result_A, care conține notele elevului A la 3 Discipline pentru primii doi ani de școală și dorim să creăm o listă de rezultate exact similară și pentru elevul B., Vom încerca și de a face o copie profundă a result_A listă, și de a face câteva schimbări în copie profundă de mai târziu pentru a afișa notele de student B.

Exemplu 1:

În script-ul de mai sus, vom folosi deepcopy metoda de copy module pentru a copia lista result_A și result_B. Apoi, imprimăm conținutul ambelor liste pe ecran.

Output:

, ], ]

după cum puteți vedea, listele sunt identice. Mai târziu, în acest articol vom vedea cum acest lucru este diferit de copii superficiale.,

copii superficiale în Python

o copie superficială face, de asemenea, un obiect sau o listă separată de obiecte noi, dar în loc să copieze elementele copil pe noul obiect, copiază pur și simplu referințele la adresele lor de memorie. Prin urmare, dacă faceți o schimbare în obiectul original, acesta ar reflecta în obiectul copiat și invers. Pentru a spune pe scurt, ambele copii depind una de cealaltă. Acest lucru este similar cu conceptul de trecere prin referință în limbaje de programare precum C++, C# și Java.,pentru a implementa acest lucru în Python, vom folosi din nou modulul copy, dar de data aceasta vom apela funcția copy.

să folosim aceeași listă de exemple și pentru exemplul de copiere superficială.

Exemplu 2:

# Program 2 - Shallow Copyimport copyresult_A = , ]result_B = copy.copy(result_A)print(result_A)print(result_B)

În script-ul de mai sus, vom folosi copy metoda de copy modul de a face o copie superficială de lista result_A pe care am numit result_B., Apoi, conținutul ambelor liste au fost tipărite pe consola.

Output:

, ], ]

din nou, listele sunt aceleași, așa cum era de așteptat. Apoi, vom explica diferența dintre rezultatele pe care le obține de la copy și deepcopy funcții.

diferența dintre copiile adânci și superficiale

acum că am discutat ce copii superficiale și profunde sunt și de ce creăm copii, este timpul să vorbim despre diferența dintre ele., În esență, există doar două diferențele de bază și sunt legate între ele:

  1. copie Profundă stochează copii ale unui obiect valori, întrucât copie superficială povești referiri la originalul adresa de memorie
  2. copie Profundă nu reflectă modificările aduse noi/copiate obiect în obiectul original; întrucât, în copie superficială nu

Înainte de a trece la punerea în aplicare, Aș vrea să vă imaginați acest scenariu. Să presupunem că doi oameni doresc să împartă o băutură; ei au două pahare goale și două paie., Ei pot împărți această băutură în două moduri:

  1. puneți băutura într-un pahar și puneți ambele paie în acel pahar pentru a împărtăși
  2. puneți băutura în ambele pahare și puneți câte o paie în fiecare pahar

primul scenariu este cel al unei copii superficiale. Ambele variabile / instanțe sunt îndreptate / folosind aceeași locație de memorie pentru operațiunile lor. Al doilea scenariu este cel al unei copii profunde. Ambele variabile / instanțe sunt îndreptate spre / folosind două locații de memorie diferite pentru operațiunile lor.,pentru a face diferența clară, să folosim aceste informații în cele două exemple de mai sus, începând cu exemplul 1.mai sus, am creat lista result_Ași am făcut o copie profundă a acesteia numită result_B. Să încercăm să schimbe conținutul în result_B si vezi daca are vreun efect asupra conținutului result_A.

Output:

Original List:, ]Deep Copy:, ]

rezultatul așteptat este că lista inițială rămâne neschimbată., Și după cum puteți vedea, modificările din copia profundă nu au afectat lista originală.

acum, să încercăm același lucru cu exemplul 2-Copie superficială.

Output:

Original List:, ]Shallow Copy:, ]

aici rezultatul așteptat este că atât lista originală, cât și lista copiată sunt modificate după schimbarea unică. Și după cum puteți vedea, modificarea copiei superficiale a dus la faptul că modificarea se reflectă și în lista originală.

concluzie

în această postare, am vorbit despre ce este o copie superficială și profundă și cum le putem face în limbajul Python folosind modulul „copiere”., Am folosit două dintre funcțiile sale și anume copy și deepcopy pentru a face superficial și profund copii, respectiv. Mai mult, am discutat cele două diferențe de bază între o copie superficială și o copie profundă și, de asemenea, am implementat o copie superficială și profundă în python pentru a înțelege aceste diferențe într-un mod mai bun.