Python Shallow Copy and Deep Copy (Magyar)
Copy an Object in Python
in Python, we use=
operator to create a copy of an object. Lehet, hogy úgy gondolja, hogy ez új objektumot hoz létre; nem. csak egy új változót hoz létre, amely megosztja az eredeti objektum hivatkozását.
Vegyünk egy példát, ahol létrehozunk egy old_list nevű listát, és átadunk egy objektumhivatkozást a new_list-nek a =
operátor használatával.,
1. példa: Copy using = operator
amikor a program felett futunk, a kimenet a következő lesz:
Old List: , , ]ID of Old List: 140673303268168New List: , , ]ID of New List: 140673303268168
mint látható a kimenetről mind a változók old_list, mind a new_list ugyanazt az azonosítót osztja i. e 140673303268168
.
tehát, ha módosítani szeretné a new_list vagy az old_list értékeit, a változás mindkettőben látható.
lényegében előfordulhat, hogy az eredeti értékek változatlanok maradnak, csak az új értékeket módosítják, vagy fordítva., A Python-ban kétféle módon lehet másolatot készíteni:
- sekély másolat
- mély másolat
a másolás működéséhez a copy
modult használjuk.
Copy Module
használjuk acopy
modul Python sekély és mély másolási műveletek. Tegyük fel, hogy át kell másolnia az összetett listát, mondjuk x. például:
import copycopy.copy(x)copy.deepcopy(x)
itt a copy()
visszaadja az X sekély példányát. hasonlóképpen, deepcopy()
visszaadja az X mély másolatát.,
Shallow Copy
egy sekély példány létrehoz egy új objektumot, amely tárolja az eredeti elemek hivatkozását.
tehát egy sekély példány nem hoz létre beágyazott objektumok másolatát, hanem csak átmásolja a beágyazott objektumok hivatkozását. Ez azt jelenti, hogy a másolási folyamat nem rekurzív vagy nem hoz létre másolatot a beágyazott objektumokról.,
2.példa: hozzon létre egy példányt sekély másolattal
import copyold_list = , , ]new_list = copy.copy(old_list)print("Old list:", old_list)print("New list:", new_list)
a program futtatásakor a kimenet:
Old list: , , ]New list: , , ]
a fenti programban létrehoztunk egy beágyazott listát , majd sekély másolatot a copy()
módszer.
Ez azt jelenti, hogy új, független objektumot hoz létre ugyanazzal a tartalommal. Ennek ellenőrzéséhez kinyomtatjuk mind a old_list, mind a new_list fájlt.,
annak megerősítéséhez, hogy a new_list eltér az old_list-től, Megpróbálunk új beágyazott objektumot hozzáadni az eredetihez és ellenőrizni.
példa 3: hozzátéve, hogy old_list, a sekély copy
amikor fut a program, akkor kimenet:
Old list: , , , ]New list: , , ]
a fenti program, hoztunk létre egy sekély példányát old_list. A new_list hivatkozásokat tartalmaz az old_list-ben tárolt eredeti beágyazott objektumokra. Ezután hozzáadjuk az új listát, azaz a az old_list-be., Ez az új Albérlet nem másolt new_list.
azonban, ha megváltoztatja a beágyazott objektumok old_list, a változások megjelennek new_list.
4. Példa: új beágyazott objektum segítségével Sekély másolása
import copyold_list = , , ]new_list = copy.copy(old_list)old_list = 'AA'print("Old list:", old_list)print("New list:", new_list)
Amikor fut a program, kiírja, hogy:
Old list: , , ]New list: , , ]
Deep Copy
mély másolat létrehoz egy új objektumot, majd rekurzívan hozzáadja a másolatot beágyazott objektumok jelen az eredeti elemekkel.
folytassuk a 2. példával., Deep copy-t fogunk létrehozni a deepcopy()
függvény segítségével, amely a copy
modulban található. A deep copy az eredeti objektum és az összes beágyazott objektum független másolatát hozza létre.
5.példa: a lista másolása deepcopy ()
import copyold_list = , , ]new_list = copy.deepcopy(old_list)print("Old list:", old_list)print("New list:", new_list)
amikor futtatjuk a programot, akkor kimenet:
Old list: , , ]New list: , , ]
a fenti programban a deepcopy()
függvényt használjuk a hasonló példány létrehozásához.,
Ha azonban módosítja a beágyazott objektumokat az eredeti objektum old_list alkalmazásban, akkor a new_list másolása nem változik.
6. példa: új beágyazott objektum hozzáadása a listához a Deep copy
használatával a program futtatásakor a kimenet:
Old list: , , ]New list: , , ]
a fenti programban, amikor új értéket rendelünk az old_list-hez, csak a old_list módosul. Ez azt jelenti, hogy mind a old_list, mind a new_list független. Ennek oka az, hogy az old_list rekurzívan másolt, ami igaz az összes beágyazott objektumra.