Néha egy objektum teljes másolatát szeretné, máskor pedig azt, hogy hivatkozásokat használjon. Tekintse meg a különbségeket a műveletekben.
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.
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, a módosítások érvényesítése ben fő_lista is.
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:
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.
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.
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ő_listanevű 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.
Munka egyéni objektumokkal
Egyéni objektumot úgy hozhat létre, hogy 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).
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.
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.