Capitolul Anterior: Seturi și Congelate Seturi
Capitolul Următor: Funcții

Superficială și Profundă Copie

Introducere


după Cum am văzut în capitolul „Tipuri de Date și Variabile”, Python are un comportament ciudat – în comparație cu alte limbaje de programare – atunci când atribuie și copierea simplă tipuri de date ca numere întregi și siruri de caractere. Diferența dintre copierea superficială și cea profundă este relevantă numai pentru obiectele compuse, care sunt obiecte care conțin alte obiecte, cum ar fi liste sau instanțe de clasă.,
în următorul fragment de cod y indică aceeași locație de memorie decât X. Aceasta se schimbă atunci când atribuim o valoare diferită lui y. în acest caz, y va primi o locație de memorie separată, așa cum am văzut în capitolul „tipuri de date și variabile”.

>>> x = 3>>> y = x

dar chiar dacă acest comportament intern pare ciudat în comparație cu limbajele de programare precum C, C++ și Perl, totuși rezultatele observabile ale atribuțiilor răspund așteptărilor noastre. Dar poate fi problematic, dacă copiem obiecte mutabile precum liste și dicționare.
Python creează copii reale numai dacă trebuie, adică., dacă utilizatorul, programatorul, o cere în mod explicit.
vă vom prezenta cele mai importante probleme, care pot apărea atunci când copiați obiecte mutabile, adicăcând copiați liste și dicționare.

Copierea unei liste

>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1

În exemplul de mai sus, o simplă listă este atribuit colours1. În pasul următor, atribuim color1 colors2. După aceasta, o nouă listă este atribuită colors2.
așa cum ne-am așteptat, valorile culorilor1 au rămas neschimbate., Ca și în exemplele noastre la capitolul „tipuri de Date și variabile”, o nouă locație de memorie a fost alocată pentru colours2, pentru că am alocat o nouă listă pentru această variabilă.

>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1

Dar întrebarea este, ce se va întâmpla, dacă vom schimba un element din lista de colours2 sau colours1?
în exemplul de mai sus, atribuim o nouă valoare celui de-al doilea element de colors2. O mulțime de începători vor fi uimiți că lista de culori1 a fost „automat” schimbat, de asemenea.,
explicația este că nu a existat nici o nouă atribuire a colors2, doar la unul dintre elementele sale.

Copiere cu Felie Operator

este posibil să copiați complet superficial lista structurilor cu felie operator fără a avea efecte secundare, pe care le-am descris mai sus:

>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>> 

Dar cât de curând o listă conține subliste, avem aceeași dificultate, adică doar indicii pentru a thesublists.,

>>> lst1 = ]>>> lst2 = lst1

Acest comportament este descris în diagrama de mai jos:

Dacă se atribuie o noua valoare pentru 0th Element de una dintre cele două liste, nu va fi nici un efect secundar. Probleme apar, dacă schimbați unul dintre elementele sublist.

>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]

următoarea diagramă descrie ce se întâmplă, dacă unul dintre elementele de o sublistă va fi schimbat: Atât conținutul de lst1 și lst2 s-au schimbat.,

Folosind Metoda deepcopy din Modulul copie

O soluție la problemele descrise este de a folosi modul „copiere”. Acest modul oferă metoda „copiere”, care permite o copie completă ao listă arbitrară, adică.liste superficiale și alte liste.
următorul script foloseste exemplul nostru de mai sus și această metodă:

from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1

Dacă ne-am salva acest script sub numele de deep_copy.py și dacă numim scenariul cu „python deep_copy.,py”, vom primi următoarea ieșire:

$ python deep_copy.py ]]

Capitolul Anterior: Seturi și Congelate Seturi
Capitolul Următor: Funcții

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *