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.

instagram viewer

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.