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:

  1. 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
  2. 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:

  1. tegye az italt egy pohárba, és tegye mind a szalmát az üvegbe, hogy megosszák
  2. 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_Atartalmá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.