Izpratne par seklo un dziļo kopiju Python

Izpratne par seklo un dziļo kopiju Python
Tādi lasītāji kā jūs palīdz atbalstīt MUO. Veicot pirkumu, izmantojot saites mūsu vietnē, mēs varam nopelnīt filiāles komisiju. Lasīt vairāk.

Python piedāvā vairākas efektīvas pieejas datu pārvaldībai. Strādājot ar datu struktūrām, piemēram, ligzdotiem sarakstiem, vārdnīcām vai pielāgotiem objektiem, ir ļoti svarīgi izprast seklas un dziļas kopēšanas jēdzienus.





MUO dienas video RITINĀT, LAI TURPINĀTU AR SATURU

Gan seklā, gan dziļā kopija ļauj izveidot datu struktūru kopijas, taču tās darbojas atšķirīgi attiecībā uz ligzdotajiem datiem.





Seklās kopijas izmantošana

Seklā kopija darbojas, izveidojot oriģinālā objekta augstākā līmeņa struktūras kopiju. Tas nozīmē, ka, ja sākotnējais objekts satur ligzdotus objektus, kopijā būs atsauce uz tiem pašiem ligzdotajiem objektiem, uz kuriem attiecas oriģināls. Citiem vārdiem sakot, izveidojot sekla objekta kopiju, tiek dublēta tā visattālākā struktūra, nevis visi tajā ietvertie ligzdotie objekti.





kā klausīties podkastus datorā

Lai Python veiktu seklu kopēšanu, varat izmantot kopēšanas moduli kopēt () funkcija vai .copy() metode uz objektu.

Apsveriet piemēru darbs ar sarakstu vai vārdnīcu Python .



import copy 

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the nested list
shallow_copy[2][0] = 99
main_list[2][1] = 100

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Iepriekš minētajā kodā galvenais_saraksts mainīgais satur sarakstu, kurā ir veseli skaitļi, un iekšējo sarakstu (ligzdoto objektu), kas satur burtus. Kopēšanas funkcija izveido kopiju galvenais_saraksts ko kods saglabā citā mainīgajā, sekls_kopija .

Visas izmaiņas, ko veicat sekls_kopija ligzdots saraksts tieši ietekmēs arī sarakstu galvenais_saraksts un otrādi. Šīs izmaiņas parāda, ka ligzdotais vai iekšējais saraksts sekls_kopija ir tikai atsauce uz to galvenais_saraksts , padarot izmaiņas spēkā galvenais_saraksts arī.





  izmaiņas seklo kopiju ligzdotajā sarakstā

Tikmēr jebkuras izmaiņas, kas veiktas ārējos vienumos (veselos skaitļos). sekls_kopija vai galvenais_saraksts ietekmēs tikai šo gadījumu. Šie ārējie vienumi ir neatkarīgas vērtības pašas par sevi, nevis tikai atsauces.

import copy 

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the outer items
shallow_copy[0] = "M"
main_list[1] = "N"

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

Izvade parāda, ka abi saraksta ārējie vienumi ir neatkarīgi viens no otra:





  izmaiņas seklās kopijas ārējos vienībās

Tāda pati ideja attiecas arī uz darbu ar vārdnīcām.

dict1 = {'ten': 10, 'twenty': 20, 'double':{'thirty': 30, 'sixty': 60}} 
dict2 = dict1.copy()

# Modify inner and outer elements
dict1['double']['thirty'] = 30.00
dict1['ten'] = 10.00

print(f"The main dictionary, {dict1}")
print(f"The shallow copy dictionary, {dict2}")

Izmaiņas veiktas ligzdotajā vārdnīcā dikti1 ietekmē abus dikti1 un dict2 . Tajā pašā laikā izmaiņas ārējos posteņos dikti1 ietekmēt tikai to.

  izmantojot seklu kopiju ar ligzdotu vārdnīcu

Deep Copy izmantošana

Tā vietā, lai atsauktos uz oriģinālās kopijas ligzdotajiem objektiem, dziļā kopija veido pilnīgi atsevišķu oriģinālā objekta un tā ligzdoto objektu kopiju. Dziļās kopijas modificēšana neietekmēs sākotnējo objektu un otrādi; tās patiesi ir atsevišķas vērtības.

Lai izveidotu dziļu kopiju programmā Python, izmantojiet dziļa kopija () kopēšanas moduļa funkcija.

Apsveriet piemēru darbam ar sarakstu.

import copy 

main_list = [200, 300, ["I", "J"]]
deep_copy = copy.deepcopy(main_list)

# Modify the inner and outer list
deep_copy[2][0] = "K"
main_list[0] = 500

print(f"The main list: {main_list}")
print(f"The deep copy list: {deep_copy}")

Šeit kods veic dziļu kopiju galvenais_saraksts , izveidojot neatkarīgu kopiju ar nosaukumu dziļa_kopija .

Kad modificējat ligzdoto sarakstu vai ārējos vienumus dziļa_kopija , jūsu veiktās izmaiņas neietekmē sākotnējo sarakstu un otrādi. Tas parāda, ka ligzdotais saraksts vai ārējie elementi netiek koplietoti starp abām kopijām.

kā iegūt tirdzniecības kartes Steam
  izmantojot dziļo kopiju ar ligzdotu sarakstu

Darbs ar pielāgotiem objektiem

Varat izveidot pielāgotu objektu, izmantojot Python klases noteikšana un izveidot klases gadījumu.

Šeit ir piemērs vienkārša objekta izveidei no a Grāmata klase:

classBook: 
    def__init__(self, title, authors, price):
        self.title = title
        self.authors = authors
        self.price = price

    def__str__(self):
        returnf"Book(title='{self.title}', author='{self.authors}', \
price='{self.price}')"

Tagad izveidojiet gan seklu, gan dziļu šī gadījuma kopiju Grāmata klasē, izmantojot kopiju modulis.

import copy 

# Create a Book object
book1 = Book("How to MakeUseOf Shallow Copy", \
             ["Bobby Jack", "Princewill Inyang"], 1000)

# Make a shallow copy
book2 = copy.copy(book1)

# Modify the original object
book1.authors.append("Yuvraj Chandra")
book1.price = 50

# Check the objects
print(book1)
print(book2)

Kā redzat, seklā kopija ( grāmata 2 ) ir jauns objekts, bet tas atsaucas uz to pašu iekšējo objektu (autoru sarakstu) kā sākotnējais objekts ( grāmata 1 ). Tādējādi sākotnējā objekta autoru izmaiņas ietekmē abus gadījumus (grāmata1 un grāmata2), savukārt izmaiņas ārējā vienumā ( cena ) ietekmē tikai sākotnējo objektu ( grāmata 1 ).

  izmantojot seklu kopiju ar pielāgotu objektu

No otras puses, izveidojot dziļu kopiju, tiek izveidota neatkarīga oriģinālā objekta kopija, ieskaitot visu tajā esošo objektu kopijas.

# Create a Book object 
book1 = Book("Why MakeUseOf Deep Copy?", \
             ["Bobby Jack", "Yuvraj Chandra"], 5000)

# Make a deep copy
book2 = copy.deepcopy(book1)

# Modify the original object
book1.authors.append("Princewill Inyang")
book1.price = 60

# Check the objects
print(book1)
print(book2)

Šajā gadījumā dziļā kopija ( grāmata 2 ) ir pilnīgi neatkarīgs objekts un maina sākotnējo objektu ( grāmata 1 ) to neietekmē.

  izmantojot dziļo kopiju ar pielāgotu objektu

Izmanto seklai kopijai un dziļai kopijai

Ir ļoti svarīgi saprast dziļu un seklu kopiju, lai jūs varētu izvēlēties piemērotu pieeju datu apstrādei. Tālāk ir norādīti daži scenāriji, kuros katra metode ir piemērojama.

  • Izmantojiet seklu kopiju, ja vēlaties replicēt sarežģītu objektu, neģenerējot jaunus tā ligzdoto objektu gadījumus. Šī pieeja ir efektīvāka atmiņā un ātrāka nekā dziļā kopēšana, jo tā nedublē ligzdotos objektus.
  • Izmantojiet seklu kopiju, lai izveidotu objekta stāvokļa momentuzņēmumu, vienlaikus koplietojot dažus pamatā esošos datus starp oriģinālajiem un kopētajiem objektiem.
  • Izmantojiet dziļo kopiju, ja vēlaties modificēt objekta kopiju, neietekmējot oriģinālu. Tādējādi tiek ģenerētas neatkarīgas ligzdotu objektu kopijas, nodrošinot, ka visas kopijā veiktās izmaiņas neattiecas uz oriģinālu.
  • Dziļā kopēšana ir ļoti svarīga, ja nepieciešamas neatkarīgas ligzdotu datu struktūru kopijas, galvenokārt, strādājot ar rekursīvām vai sarežģītām objektu hierarhijām.

Veiktspēja un apsvērumi

Tā kā seklā kopija nerada jaunus ligzdotu objektu gadījumus, tā parasti darbojas ātrāk un izmanto mazāk atmiņas nekā dziļā kopija. Tomēr oriģinālam un seklajai kopijai var būt nevēlamas blakusparādības, mainot koplietotos iekšējos vienumus.

Īpaši lielām un dziļi ligzdotām datu struktūrām, dziļai kopijai, rekursīva procedūra , var būt lēnāks un izmantot vairāk atmiņas. Tomēr tas nodrošina pilnīgu neatkarību starp oriģinālu un dziļo dublikātu, padarot sarežģītu datu manipulāciju drošāku.

kā skatīties tiešraidi facebook

Labākā jūsu datu kopēšanas iespēja

Daudzas programmēšanas valodas izmanto seklas un dziļas kopijas jēdzienu. Izpratne par to ļauj manipulēt ar datiem bez neparedzētām sekām.

Izmantojot seklās un dziļās kopēšanas metodes, varat izvēlēties labāko pieeju datu struktūru drošai dublēšanai. Izprotot ietekmi uz jūsu datiem, jūs iegūsit uzticamākus un paredzamākus koda rezultātus.