Bevezetés
ebben az oktatóanyagban a sekély példányokat vs mély másolatokat fogjuk megvitatni Python példák segítségével. A mély és sekély másolat definícióját, valamint a Python nyelven történő implementációját fogjuk lefedni, hogy felmérjük a két példánytípus közötti alapvető különbségeket.
sok olyan programban, amelyet írunk, függetlenül attól, hogy mennyire alaposak, végül egy listát vagy egy objektumot kell másolnunk a sok ok közül, mint például a számítási hatékonyság., Ennek két módja van, vagy készítsen mély másolatot vagy sekély másolatot. Mielőtt megbeszélnénk a kettő közötti különbségeket, először értsük meg, hogy pontosan milyen mély és sekély példányok vannak.
mély másolatok Python
egy mély másolat készít egy teljes objektum vagy lista új, különálló másolatát saját egyedi memóriacímével. Ez azt jelenti, hogy az objektum/lista új példányában végrehajtott módosítások nem tükröződnek az eredetiben. Ez a folyamat először új lista vagy objektum létrehozásával történik, majd rekurzívan másolja az elemeket az eredetiből az újba.,
röviden fogalmazva, mindkét objektum teljesen független egymástól. Ez hasonló a koncepció halad érték nyelven, mint a C++, Java, C#.
Deep Copy Example
a mély másolatok koncepciójának megvalósításához a Python-ban a másolási modult fogjuk használni.
tegyük fel, hogy van egy listánk a result_A
nevű listákról, amelyek az iskola első két évében a 3 tantárgyból álló a hallgató osztályait tartalmazzák, és pontosan hasonló eredménylistát szeretnénk létrehozni a B hallgató számára is., Megpróbálunk egy mély másolatot készíteni a result_A
listáról, és néhány változtatást a mély másolatban később a B.
1.példa:
a fenti szkriptben a deepcopy
módszert használjuk a copy
modul másolási lista result_A
to result_B
. Ezután kinyomtatjuk mindkét lista tartalmát a képernyőn.
kimenet:
, ], ]
mint látható, a listák azonosak. Később ebben a cikkben látni fogjuk, hogy ez különbözik a sekély másolatoktól.,
sekély példányok Python
egy sekély példány külön új objektum objektumot vagy listát is készít, de ahelyett, hogy a gyermekelemeket az új objektumra másolná, egyszerűen átmásolja a memóriacímekre való hivatkozásokat. Ezért, ha megváltoztatja az eredeti objektumot, akkor a másolt objektumban tükröződik, és fordítva. Röviden szólva, mindkét példány egymástól függ. Ez hasonló a koncepció halad referencia programozási nyelvek, mint a C++, C#, Java.,
sekély másolási példa
ennek megvalósításához a Python-ban a copy
modult használjuk újra, de ezúttal a copy
függvényt fogjuk hívni.
használjuk ugyanazt a példalistát a sekély másolási példához is.
2.példa:
# Program 2 - Shallow Copyimport copyresult_A = , ]result_B = copy.copy(result_A)print(result_A)print(result_B)
a fenti szkriptben a copy
módszert használjuk a copy
modulból a result_A
lista sekély másolatának készítéséhez megneveztük result_B
., Ezután mindkét lista tartalmát kinyomtatták a konzolra.
kimenet:
, ], ]
ismét a listák ugyanazok, mint várták. Ezután elmagyarázzuk a copy
és deepcopy
függvények közötti különbséget.
különbség a mély és sekély példányok között
most, hogy megvitattuk, milyen sekély és mély példányok vannak, és miért hozunk létre másolatokat, itt az ideje beszélni a köztük lévő különbségről., Lényegében csak két alapvető különbségek összefüggenek egymással:
- Mély másolatát tárolja példányban egy tárgy értékek, mivel a sekély másolás történetek hivatkozások az eredeti memória cím
- Mély másolat nem tükrözi a változtatásokat az új/másolt objektumot az eredeti tárgy; mivel sekély másolat nem
Mielőtt rátérnénk a végrehajtását, Szeretném elképzelni, hogy ez a forgatókönyv. Tegyük fel, hogy két ember szeretne megosztani egy italt; van két üres poharuk és két szalmájuk., Ezt az italt kétféle módon oszthatják meg:
- tegye az italt egy pohárba, és tegye mind a szalmát az üvegbe, hogy megosszák
- az italt mindkét pohárba, és tegyen egy szalmát minden pohárba
az első forgatókönyv egy sekély példány. Mind a változók/példányok mutatnak/ugyanazt a memória helyét használják műveleteikhez. A második forgatókönyv egy mély példány. Mindkét változó/példány két különböző memóriahelyre mutat / használ a műveletekhez.,
összehasonlító példa
a különbség egyértelművé tétele érdekében használjuk ezt az információt a fenti két példánkban, kezdve az 1.példával.
fent létrehoztuk a result_A
listát, és készítettünk róla egy mély másolatot, melynek neve result_B
. Próbáljuk meg megváltoztatni a result_B
tartalmat, és nézzük meg, hogy van-e hatása a result_A
tartalmára.
kimenet:
Original List:, ]Deep Copy:, ]
a várható eredmény az, hogy az eredeti lista változatlan marad., Mint látható, a mély másolat változásai nem befolyásolták az eredeti listát.
most kipróbálhatjuk ugyanazt a dolgot a 2. példával-sekély másolat.
kimenet:
Original List:, ]Shallow Copy:, ]
itt a várt eredmény az, hogy mind az eredeti lista, mind a másolt lista módosul az egyetlen módosítás után. Mint láthatja, a sekély példány módosítása azt eredményezte, hogy ez a változás az eredeti listában is tükröződik.
következtetés
ebben a bejegyzésben arról beszéltünk, hogy mi a sekély és mély másolat, és hogyan készíthetjük őket Python nyelven a “másolás” modul segítségével., Két funkcióját használtuk: copy
és deepcopy
sekély és mély másolatok készítéséhez. Továbbá, megbeszéltük a két alapvető különbség egy sekély és egy mély példányt, valamint végre sekély és mély példányt python megérteni ezeket a különbségeket egy jobb módja.