Joskus haluat täyden kopion objektista, toisinaan haluat sen käyttävän viittauksia. Katso erot toiminnassa.

Python tarjoaa useita tehokkaita tapoja hallita tietoja. Matala- ja syväkopiokäsitteiden ymmärtäminen on ratkaisevan tärkeää, kun työskentelet tietorakenteiden, kuten sisäkkäisten luetteloiden, sanakirjojen tai mukautettujen objektien, kanssa.

Sekä matalan että syvän kopion avulla voit tehdä kopioita tietorakenteista, mutta ne toimivat eri tavalla sisäkkäisten tietojen suhteen.

Matalakopion käyttö

Matala kopio toimii luomalla kopion alkuperäisen objektin ylimmän tason rakenteesta. Tämä tarkoittaa, että jos alkuperäinen objekti sisältää sisäkkäisiä objekteja, kopio viittaa samoihin sisäkkäisiin objekteihin kuin alkuperäinen. Toisin sanoen matalan kopion tekeminen objektista kopioi sen uloimman rakenteen, ei sen sisältämiä sisäkkäisiä objekteja.

Jos haluat tehdä matalan kopioinnin Pythonissa, voit käyttää kopiointimoduulia kopio() toiminto tai .kopio() menetelmä objektiin.

Harkitse esimerkkiä työskennellä luettelon tai sanakirjan kanssa Pythonissa.

instagram viewer
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}")

Yllä olevassa koodissa main_list muuttuja sisältää luettelon, joka sisältää kokonaislukuja, ja sisäisen luettelon (sisäkkäinen objekti), joka sisältää kirjaimia. Kopiointitoiminto luo kopion main_list jonka koodi tallentaa toiseen muuttujaan, matala_kopio.

Kaikki muutokset, joita teet matala_kopio sisäkkäinen luettelo vaikuttaa myös suoraan main_list ja päinvastoin. Nämä muutokset osoittavat, että sisäkkäinen tai sisäinen luettelo matala_kopio on vain viittaus siihen main_list, jolloin muutokset tulevat voimaan main_list liian.

Sillä välin kaikki muutokset, jotka on tehty kumman tahansa ulompiin alkioihin (kokonaislukuihin). matala_kopio tai main_list vaikuttaa vain siihen tapaukseen. Nämä ulkoiset kohteet ovat itsenäisiä arvoja itsessään, eivät vain pelkkiä viittauksia.

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}")

Tulos osoittaa, että molemmat listan ulommat kohteet ovat riippumattomia toisistaan:

Sama ajatus pätee myös sanakirjojen parissa.

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}")

Sisäkkäiseen sanakirjaan tehty muutoksia sanelu1 vaikuttaa molempiin sanelu1 ja sanelu 2. Samaan aikaan muutoksia ulkoisiin kohtiin sanelu1 vaikuttaa vain siihen.

Deep Copyn käyttö

Sen sijaan, että viitattaisiin alkuperäisen kopion sisäkkäisiin objekteihin, syväkopio tekee täysin erillisen kopion alkuperäisestä objektista ja sen sisäkkäisistä objekteista. Syväkopion muokkaaminen ei vaikuta alkuperäiseen objektiin ja päinvastoin; ne ovat todella erillisiä arvoja.

Jos haluat tehdä syväkopion Pythonissa, käytä syväkopio () kopiointimoduulin toiminto.

Harkitse esimerkkiä luettelon kanssa työskentelystä.

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}")

Tässä koodi suorittaa syvän kopion main_list, luomalla itsenäisen kopion nimeltä syvä_kopio.

Kun muokkaat sisäkkäistä luetteloa tai ulkoisia kohteita syvä_kopio, tekemäsi muutokset eivät vaikuta alkuperäiseen luetteloon ja päinvastoin. Tämä osoittaa, että sisäkkäisiä luetteloita tai ulkoisia elementtejä ei jaeta näiden kahden kopion kesken.

Työskentely mukautettujen objektien kanssa

Voit luoda mukautetun objektin käyttämällä Python-luokan määrittely ja luokalle esiintymän luominen.

Tässä on esimerkki yksinkertaisen objektin luomisesta a Kirja luokka:

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}')"

Tee nyt sekä matala kopio että syvä kopio tästä esiintymästä Kirja luokka käyttäen kopio moduuli.

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)

Kuten näette, matala kopio (kirja 2) on uusi objekti, mutta se viittaa samaan sisäiseen objektiin (tekijäluetteloon) kuin alkuperäinen objekti (kirja 1). Näin ollen muutos alkuperäisen objektin tekijöihin vaikuttaa molempiin esiintymiin (kirja1 ja kirja2), kun taas muutos ulompaan kohteeseen (hinta) vaikuttaa vain alkuperäiseen kohteeseen (kirja 1).

Toisaalta syväkopion tekeminen luo itsenäisen kopion alkuperäisestä objektista, mukaan lukien kopiot kaikista sen sisältämistä objekteista.

# 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)

Tässä tapauksessa syväkopio (kirja 2) on täysin itsenäinen objekti ja muokkaa alkuperäistä objektia (kirja 1) ei vaikuta siihen.

Käytetään matalakopiointiin ja syväkopiointiin

On erittäin tärkeää ymmärtää syvä ja matala kopio, jotta voit valita sopivan menetelmän tietojen käsittelyyn. Tässä on joitain skenaarioita, joissa kutakin menetelmää voidaan soveltaa:

  • Käytä matalaa kopiota, jos haluat replikoida monimutkaisen objektin luomatta uusia esiintymiä sen sisäkkäisistä objekteista. Tämä lähestymistapa on muistitehokkaampi ja nopeampi kuin syväkopiointi, koska se ei kopioi sisäkkäisiä objekteja.
  • Käytä matalaa kopiota luodaksesi tilannekuvan objektin tilasta samalla kun jaat taustalla olevia tietoja alkuperäisen ja kopioitujen objektien välillä.
  • Käytä syväkopiota, jos haluat muokata objektin kopiota vaikuttamatta alkuperäiseen. Tämä luo itsenäisiä kopioita sisäkkäisistä objekteista ja varmistaa, että kopioon tehdyt muutokset eivät koske alkuperäistä.
  • Syväkopiointi on kriittinen, kun tarvitset itsenäisiä kopioita sisäkkäisistä tietorakenteista, pääasiassa kun käsitellään rekursiivisia tai monimutkaisia ​​objektihierarkioita.

Suorituskyky ja huomioita

Koska matala kopio ei luo uusia sisäkkäisten objektien esiintymiä, se toimii yleensä nopeammin ja käyttää vähemmän muistia kuin syväkopio. Alkuperäisellä ja matalalla kopiolla voi kuitenkin olla ei-toivottuja sivuvaikutuksia jaettujen sisäisten kohteiden muuttamisesta.

Erityisesti suurille ja syvälle sisäkkäisille tietorakenteille, syväkopiointi, rekursiivinen menettely, voi olla hitaampi ja käyttää enemmän muistia. Se kuitenkin varmistaa täydellisen riippumattomuuden alkuperäisen ja syvän kaksoiskappaleen välillä, mikä tekee monimutkaisista tietojen käsittelystä turvallisempaa.

Paras kopiointivaihtoehto tiedoillesi

Monet ohjelmointikielet käyttävät matalan ja syvän kopion käsitettä. Sen ymmärtäminen antaa sinun käsitellä tietoja ilman odottamattomia seurauksia.

Käyttämällä matala- ja syväkopiointitekniikoita voit valita parhaan tavan monistaa tietorakenteet turvallisesti. Kun ymmärrät vaikutukset tietoihisi, saat koodistasi luotettavampia ja ennustettavampia tuloksia.