A sekély és mély másolat megértése Pythonban

A sekély és mély másolat megértése Pythonban
Az Önhöz hasonló olvasók támogatják a MUO-t. Amikor a webhelyünkön található linkek használatával vásárol, társult jutalékot kaphatunk. Olvass tovább.

A Python számos hatékony módszert kínál az adatok kezelésére. A sekély és mély másolás fogalmainak megértése kulcsfontosságú, amikor olyan adatstruktúrákkal dolgozik, mint a beágyazott listák, szótárak vagy egyéni objektumok.





A nap MUO videója GÖRGÖZSEN A TARTALOM FOLYTATÁSHOZ

Mind a sekély, mind a mély másolat lehetővé teszi az adatstruktúrák replikáinak készítését, de a beágyazott adatok esetében eltérően működnek.





Sekély másolat használata

A sekély másolat úgy működik, hogy másolatot készít az eredeti objektum legfelső szintű szerkezetéről. Ez azt jelenti, hogy ha az eredeti objektum beágyazott objektumokat tartalmaz, a másolat ugyanazokra a beágyazott objektumokra fog hivatkozni, mint az eredeti. Más szavakkal, egy objektum sekély másolatának elkészítése annak legkülső struktúráját duplikálja, nem pedig a benne található beágyazott objektumokat.





Egy sekély másolás végrehajtásához Pythonban használhatja a másolási modult másolat() funkció vagy a .másolat() módszer az objektumon.

Vegyünk egy példát arra listával vagy szótárral dolgozik Pythonban .



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}")

A fenti kódban a fő_lista változó egy egész számokat tartalmazó listát és egy betűket tartalmazó belső listát (beágyazott objektum) tartalmaz. A másolás funkció másolatot készít a fő_lista amelyet a kód egy másik változóban tárol, sekély_másolat .

Bármilyen változtatást hajt végre a sekély_másolat beágyazott lista is közvetlenül érinti a fő_lista és fordítva. Ezek a változtatások azt mutatják, hogy a beágyazott vagy belső listája a sekély_másolat csak utalás arra, hogy a fő_lista , így a módosítások hatályba lépnek fő_lista is.





  változások a sekély másolatok beágyazott listájában

Eközben a külső elemeken (az egész számokon) végzett változtatások bármelyikben sekély_másolat vagy fő_lista csak arra az esetre lesz hatással. Ezek a külső elemek önmagukban független értékek, nem csupán hivatkozások.

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}")

A kimenet azt mutatja, hogy a lista mindkét külső eleme független egymástól:





  módosítások a sekély példány külső elemein

Ugyanez vonatkozik a szótárak használatára is.

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}")

Változtatások történtek a(z) beágyazott szótárában dict1 mindkettőt érinti dict1 és dict2 . Ugyanakkor a külső elemek módosításai dict1 csak azt érinti.

  sekély másolat használata beágyazott szótárral

A Deep Copy használata

Ahelyett, hogy az eredeti másolat beágyazott objektumaira hivatkozna, a mélymásolat teljesen külön másolatot készít az eredeti objektumról és annak beágyazott objektumairól. A mélymásolat módosítása nincs hatással az eredeti objektumra, és fordítva; ezek valóban külön értékek.

Ha mélymásolatot szeretne készíteni Pythonban, használja a mélymásolat() a másoló modul funkciója.

Hogyan lehet megnyitni a flash meghajtót a Windows 10 rendszeren

Vegyünk egy példát a listával való munkára.

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}")

Itt a kód egy mély másolatot hajt végre fő_lista nevű független másolat létrehozása deep_copy .

Amikor módosítja a beágyazott listát vagy a külső elemeket a deep_copy , a változtatások nem érintik az eredeti listát, és fordítva. Ez azt mutatja, hogy a beágyazott lista vagy a külső elemek nincsenek megosztva a két másolat között.

  mélymásolat használata beágyazott listával

Munka egyéni objektumokkal

Egyéni objektumot a következővel hozhat létre Python osztály meghatározása és az osztály példányának létrehozása.

Íme egy példa egy egyszerű objektum létrehozására a Könyv osztály:

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}')"

Most készítsen egy sekély másolatot és egy mély másolatot egy példányról Könyv osztály segítségével a másolat modult.

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)

Mint látható, a sekély másolat ( könyv2 ) egy új objektum, de ugyanarra a belső objektumra (szerzőlista) hivatkozik, mint az eredeti objektum ( könyv1 ). Ezért az eredeti objektum szerzőinek módosítása mindkét példányt érinti (könyv1 és könyv2), míg a külső elem módosítása ( ár ) csak az eredeti objektumot érinti ( könyv1 ).

  sekély másolat használata egyéni objektummal

Másrészt a mélymásolat elkészítése az eredeti objektum független másolatát hozza létre, beleértve a benne lévő összes objektum másolatát is.

# 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)

Ebben az esetben a mély másolat ( könyv2 ) egy teljesen független objektum, és módosítja az eredeti objektumot ( könyv1 ) nem befolyásolja.

  mélymásolat használata egyéni objektummal

Sekély másoláshoz és mélymásoláshoz használható

Létfontosságú, hogy megértse a mély és sekély másolatot, hogy kiválaszthassa a megfelelő módszert az adatok manipulálásához. Íme néhány forgatókönyv, ahol az egyes módszerek alkalmazhatók:

  • Használjon sekély másolatot, ha összetett objektumot szeretne replikálni anélkül, hogy a beágyazott objektumaiból új példányokat generálna. Ez a megközelítés memóriahatékonyabb és gyorsabb, mint a mélymásolás, mivel nem duplikálja a beágyazott objektumokat.
  • Használjon sekély másolatot, hogy pillanatképet készítsen egy objektum állapotáról, miközben néhány mögöttes adatot megoszt az eredeti és a másolt objektumok között.
  • Használjon mélymásolatot, ha egy objektum replikáját az eredeti befolyásolása nélkül szeretné módosítani. Ez független másolatokat hoz létre a beágyazott objektumokról, biztosítva, hogy a másolaton végzett változtatások ne vonatkozzanak az eredetire.
  • A mélymásolás kritikus fontosságú, ha beágyazott adatstruktúrák független másolataira van szüksége, főleg ha rekurzív vagy bonyolult objektumhierarchiákkal foglalkozik.

Teljesítmény és szempontok

Mivel a sekély másolás nem hoz létre új példányokat beágyazott objektumokból, általában gyorsabban fut, és kevesebb memóriát használ, mint a mélymásolás. Az eredeti és a sekély másolat azonban nem kívánt mellékhatásokkal járhat a megosztott belső elemek megváltoztatása miatt.

Különösen nagy és mélyen beágyazott adatstruktúrák, mélymásolás, rekurzív eljárás , lassabb lehet és több memóriát használ. Ugyanakkor teljes függetlenséget biztosít az eredeti és a mély másolat között, biztonságosabbá téve a bonyolult adatkezelést.

A legjobb másolási lehetőség az adatok számára

Sok programozási nyelv használja a sekély és mély másolat fogalmát. Ennek megértése lehetővé teszi az adatok manipulálását előre nem látható következmények nélkül.

A sekély és mély másolási technikák használatával kiválaszthatja a legjobb módszert az adatszerkezetek biztonságos másolásához. Az adatokra gyakorolt ​​hatások megértésével megbízhatóbb és kiszámíthatóbb eredményeket kaphat a kóddal.