Articles

Python Matala Kopio ja Syvä Kopio


Kopioi Objektin Python

Python, käytämme = operaattori luo kopio kohde. Saatat ajatella, että tämä luo uuden objektin, se ei ole. Se vain luo uusi muuttuja, joka jakaa viittaus alkuperäisen objektin.

otetaanpa esimerkki, jossa voimme luoda luettelon nimeltä old_list ja siirtää objektin viittaus new_list käyttäen = operaattori.,

Esimerkki 1: Kopioiminen käyttäen = – operaattorilla

Kun me ajaa edellä ohjelma, tulosteeksi tulee:

Old List: , , ]ID of Old List: 140673303268168New List: , , ]ID of New List: 140673303268168

Kuten voitte nähdä alkaen lähtö molemmat muuttujat old_list ja new_list jakaa saman id en.e 140673303268168.

joten, jos haluat muuttaa mitään arvoja new_listissä tai old_listissä, muutos näkyy molemmissa.

olennaisesti, joskus voi haluta, että alkuperäiset arvot säilyvät ennallaan ja muokkaavat vain uusia arvoja tai päinvastoin., Python, on olemassa kaksi tapaa luoda kopioita:

  1. Matala Kopio
  2. Syvä Kopio

Jotta nämä kopioida työtä, emme käytä copy moduuli.

Kopioi Moduuli

käytämme copy moduuli Python matala ja syvä kopio toimintaa. Oletetaan, että, sinun täytyy kopioida yhdiste luettelo sanoa, x. Esimerkiksi:

import copycopy.copy(x)copy.deepcopy(x)

Tässä copy() paluu matala kopio x. Samoin deepcopy() paluu syvä kopio x.,

Shallow Copy

matala kopio luo uuden esineen, joka tallentaa alkuperäisten elementtien viittaukset.

joten pinnallinen kopio ei luo sisäkkäisistä esineistä kopiota, vaan se vain kopioi sisäkkäisten esineiden viittauksen. Tämä tarkoittaa sitä, että kopioprosessi ei uusii eikä luo sisäkkäisten objektien kopioita itsestään.,

Esimerkki 2: Luoda kopio käyttämällä matala kopio

import copyold_list = , , ]new_list = copy.copy(old_list)print("Old list:", old_list)print("New list:", new_list)

Kun me suorita ohjelma , tulosteeksi tulee:

Old list: , , ]New list: , , ]

edellä ohjelma, loimme sisäkkäisiä luettelo ja sitten matala kopioi se käyttäen copy() menetelmä.

tämä tarkoittaa, että se luo uuden ja itsenäisen objektin, jolla on sama sisältö. Voit tarkistaa tämän, tulostamme sekä old_list ja new_list.,

vahvista, että new_list on eri old_list, yritämme lisätä uusia sisäkkäisiä objektin alkuperäinen ja tarkista se.

Esimerkki 3: Lisäämällä old_list, käyttämällä matala kopio

Kun me suorita ohjelma, se lähtö:

Old list: , , , ]New list: , , ]

edellä esitetyn ohjelman, olemme luoneet matala kopio old_list. New_list sisältää viittauksia old_listiin tallennettuihin alkuperäisiin sisäkkäisiin esineisiin. Sitten lisätään uusi lista i.e old_listalle., Tätä uutta alilistaa ei kopioitu new_listissä.

Kuitenkin, kun muutat sisäkkäisiä objekteja old_list, muutokset näkyvät new_list.

Esimerkki 4: Lisäämällä uusia sisäkkäisiä objektin Matala kopio

import copyold_list = , , ]new_list = copy.copy(old_list)old_list = 'AA'print("Old list:", old_list)print("New list:", new_list)

Kun me suorita ohjelma, se lähtö:

Old list: , , ]New list: , , ]

Syvä Kopio

syvä kopio luo uuden objektin ja rekursiivisesti lisää kopioita sisäkkäisiä objekteja läsnä alkuperäisen elementtejä.

jatketaan esimerkillä 2., Kuitenkin, aiomme luoda syvä kopio käyttäen deepcopy() toiminto läsnä copy moduuli. Syväkopio luo riippumattoman kopion alkuperäisestä esineestä ja kaikista sen sisäkkäisistä esineistä.

Esimerkki 5: Kopiointi lista käyttäen deepcopy()

import copyold_list = , , ]new_list = copy.deepcopy(old_list)print("Old list:", old_list)print("New list:", new_list)

Kun me suorita ohjelma, se lähtö:

Old list: , , ]New list: , , ]

edellä ohjelma, käytämme deepcopy() toiminto luo kopion, joka näyttää samanlaiselta.,

Kuitenkin, jos teet muutoksia sisäkkäisiä objekteja alkuperäisen objektin old_list, näet, ei muutoksia kopioi new_list.

Esimerkki 6: Lisäämällä uusia sisäkkäisiä luettelon objektin käyttämällä Syvä kopio

Kun me suorita ohjelma, se lähtö:

Old list: , , ]New list: , , ]

edellä ohjelma, kun emme määritä uusi arvo old_list, voimme nähdä vain old_list on muutettu. Tämä tarkoittaa, että sekä old_list että new_list ovat riippumattomia. Tämä johtuu siitä, että old_listaa kopioitiin rekursiivisesti, mikä pätee kaikkiin sen sisäkkäisiin esineisiin.