Frage

Was ist der Unterschied zwischen einer tiefen Kopie und einer flachen Kopie?

War es hilfreich?

Lösung

Shallow Kopien Duplikat so wenig wie möglich. Eine flache Kopie einer Sammlung ist eine Kopie der Sammelstruktur, nicht die Elemente. Mit einer flachen Kopie, jetzt zwei Sammlungen, die einzelne Elemente teilen.

Deep Kopien duplizieren alles. Eine tiefe Kopie einer Sammlung zwei Sammlungen mit allen Elementen in der ursprünglichen Sammlung dupliziert.

Andere Tipps

Breite vs Tiefe; denke in Bezug auf einen Baum von Referenzen mit Ihrem Objekt als Wurzelknoten.

Shallow:

Vor dem Kopieren Shallow Copying Shallow Erledigt

Die Variablen A und B zu verschiedenen Bereichen des Speichers verweisen, wenn B zu A zugeordnet ist, die zwei Variablen auf den gleichen Speicherbereich beziehen. Spätere Änderungen an den Inhalten entweder in den Inhalt von anderen sofort wiedergegeben, wie sie Inhalte teilen.

Deep:

Vor dem Kopieren Deep Copying Deep Done

Die Variablen A und B zu verschiedenen Bereichen des Speichers verweisen, wenn B zu A, um die Werten in dem Speicherbereich zugeordnet ist, der ein Punkt in den Speicherbereich kopiert werden, mit dem B-Punkten. Spätere Änderungen an den Inhalten bleiben entweder einzigartig für A oder B; die Inhalte werden nicht geteilt.

Kurz gesagt, es hängt davon ab, was zeigt auf, was. In einer flachen Kopie, Objekt B Punkte A Standort im Speicher zu widersprechen. In tiefer Kopie, alle Dinge im Speicher des Objekt Eines Ort zum Objekt B Speicherplatz erhalten kopiert.

Dieser Wiki-Artikel hat ein großes Diagramm.

http://en.wikipedia.org/wiki/Object_copy

Speziell für iOS-Entwickler:

Wenn B ist eine flache Kopie von A, dann für primitive Daten ist es wie B = [A assign]; und für Objekte ist es wie B = [A retain];

B und A auf den gleichen Speicherplatz

Wenn B ist eine tiefe Kopie von A, dann ist es wie B = [A copy]; ist

B und A Punkt auf verschiedene Speicherplätze

B Speicheradresse ist die gleiche wie A ist

B gleichen Inhalt wie A der hat

Versuchen Sie folgendes Bild zu betrachten

 image description hier

Zum Beispiel Object.MemberwiseClone erstellt eine flach Kopie link

und mit ICloneable Schnittstelle Sie bekommen können tief Kopie wie hier

Shallow Kopie. Kopiert die Elementwerte von einem Objekt in ein anderes

Deep Copy:. Kopiert die Elementwerte von einem Objekt in ein anderes
Irgendwelche Zeiger Objekte werden dupliziert und Deep kopiert.

Beispiel:

class String
{
     int   size;
     char* data;
};

String  s1("Ace");   // s1.size = 3 s1.data=0x0000F000

String  s2 = shallowCopy(s1);
 // s2.size =3 s2.data = 0X0000F000
String  s3 = deepCopy(s1);
 // s3.size =3 s3.data = 0x0000F00F
 //                      (With Ace copied to this location.)

Ich habe nicht eine kurze, leicht verständlich beantworten hier zu sehen -. So werde ich es versuchen

Mit einer flachen Kopie, jedes Objekt, auf das durch die Quelle auch durch das Ziel gerichtet ist (so dass keine referenzierte Objekte werden kopiert).

Mit einer tiefen Kopie, jedes Objekt, auf das durch die Quelle kopiert und die Kopie hingewiesen wird vom Ziel (so wird es jetzt 2 jedes Objekt referenziert). Dies recurses Sie den Objektbaum.

Nur aus Gründen der leichteren Verständnis könnten Sie diesen Artikel folgen: https://www.cs.utexas.edu/~scottm/cs307/handouts/deepCopying. htm


Shallow Copy:

Shallow Kopieren


Deep Copy:

Deep Kopieren

{Stellen Sie sich zwei Objekte: A und B des gleichen Typs _t (bezogen auf C ++) und Sie denken über flach / tief Kopieren von A bis B}

Shallow Copy: Denken Sie darüber nach, wie eine Kopie einer Adresse der einfach macht eine Kopie des Verweises auf A in B. So werden die Adressen von A und B die gleiche sein heißt, sie auf den gleichen Speicherplatz zeigen werden das heißt Dateninhalte.

Deep Kopie: Einfach macht eine Kopie aller Mitglieder von A, weist Speicher in einem anderen Ort für B und dann die kopierten Mitglieder B zuordnet tiefe Kopie zu erreichen. Auf diese Weise, wenn A wird nicht existierend B im Speicher noch gültig ist. Die korrekte Bezeichnung zu verwenden, würde das Klonen, wo Sie wissen, dass sie beide sind völlig gleich, aber doch verschieden (das heißt als zwei verschiedene Einheiten im Speicherraum gespeichert). Sie können auch Ihren Klon-Wrapper an, wo Sie über Inklusion / Exklusion Liste entscheiden können, welche Eigenschaften bei tiefer Kopie auszuwählen. Dies ist eine ziemlich gängige Praxis, wenn Sie APIs erstellen.

Sie können wählen, eine flache Kopie ONLY_IF tun, verstehen Sie das Spiel stehen. Wenn Sie enorme Anzahl von Zeigern haben mit in C ++ oder C zu behandeln, eine flache Kopie eines Objekts zu tun ist wirklich eine schlechte Idee.

EXAMPLE_OF_DEEP COPY _ Ein Beispiel ist, wenn Sie versuchen, Bildverarbeitung zu tun und Objekterkennung Sie brauchen „Irrelevant und Repetitive Motion“ aus Ihren Verarbeitungsbereichen zu maskieren. Wenn Sie Bild Zeiger verwenden, dann könnten Sie die Spezifikation müssen diese Maskenbilder zu speichern. JETZT ..., wenn Sie eine flache Kopie des Bildes zu tun, wenn sich der Zeiger Referenzen aus dem Stapel abgetötet werden, verloren Sie die Referenz und seine Kopie das heißt, es wird irgendwann ein Laufzeitfehler von Zugriffsverletzung sein. In diesem Fall, was Sie brauchen, ist eine tiefe Kopie des Bildes, indem sie es zu klonen. Auf diese Weise können Sie die Masken im Falle abrufen können Sie sie in Zukunft benötigen.

EXAMPLE_OF_SHALLOW_COPY Ich bin nicht sehr gut informiert im Vergleich zu den Nutzern in Stackoverflow, so fühlt sich frei, um diesen Teil zu löschen und ein gutes Beispiel setzen, wenn Sie klären können. Aber ich glaube wirklich, es ist keine gute Idee ist, flache Kopie zu tun, wenn Sie wissen, dass Ihr Programm ist gonna run für eine unendliche Zeit das heißt kontinuierlichen „Push-Pop“ Betrieb über den Stapel mit Funktionsaufrufen. Wenn Sie etwas zu einem Amateur oder Anfänger Person demonstrieren (zum Beispiel C / C ++ Tutorial Sachen), dann ist es wahrscheinlich in Ordnung. Aber wenn Sie eine Anwendung wie die Überwachung und Erkennung System ausgeführt wird, oder Sonar-Tracking-System, sind Sie eigentlich nicht flach halten Ihre Objekte zu kopieren um, weil es Ihr Programm früher töten oder später.

char * Source = "Hello, world.";

char * ShallowCopy = Source;    

char * DeepCopy = new char(strlen(Source)+1);
strcpy(DeepCopy,Source);        

‚shallowCopy‘ verweist auf die gleiche Stelle im Speicher als ‚Quelle‘ der Fall ist. ‚Deep‘ verweist auf eine andere Stelle im Speicher, aber die Inhalte sind die gleichen.

Was ist Shallow Copy?

Shallow Kopie ist eine bitweise Kopie eines Objekts. Ein neues Objekt wird erstellt, das eine exakte Kopie der Werte im ursprünglichen Objekt hat. Wenn eines der Felder des Objekts sind Verweise auf andere Objekte werden nur die Referenzadressen d.h. kopiert werden, wird nur die Speicheradresse kopiert. Shallow Copy

In dieser Figur hat die MainObject1 Felder field1 vom Typ int und ContainObject1 vom Typ ContainObject. Wenn Sie eine flache Kopie von MainObject1 tun, wird MainObject2 erstellt mit field2 den kopierten Wert von field1 enthält, und zeigt immer noch selbst ContainObject1. Beachten Sie, dass seit field1 primitiven Typs ist, wird sein Wert auf field2 kopiert, aber da ContainedObject1 ein Objekt ist, MainObject2 immer noch auf ContainObject1. Also alle Änderungen in ContainObject1 MainObject1 werden in MainObject2 reflektiert werden.

Nun, wenn diese flache Kopie ist, mal sehen, was ist tiefere Kopie?

Was ist tief kopieren?

Eine tiefe Kopie kopiert alle Felder und erstellt Kopien von dynamisch zugewiesenen Speicher durch die Felder wies auf. Eine tiefe Kopie tritt auf, wenn ein Objekt zusammen mit den Objekten, auf die er sich bezieht kopiert wird. Deep Copy

In dieser Figur hat die MainObject1 Felder field1 vom Typ int und ContainObject1 vom Typ ContainObject. Wenn Sie eine tiefe Kopie von MainObject1 tun, wird MainObject2 mit field2 erstellt den kopierten Wert von field1 und ContainObject2 mit dem kopierten Wert von ContainObject1 enthält. Beachten Sie alle zu ContainObject1 in MainObject1 vorgenommenen Änderungen nicht in MainObject2 reflektieren.

guter Artikel

In der objektorientierten Programmierung umfasst eine Art, die eine Sammlung von Mitgliedsfeldern. Diese Felder können entweder durch Wert oder als Referenz (d.h. ein Zeiger auf einen Wert.)

gespeichert werden

In einer flachen Kopie wird eine neue Instanz des Typs erzeugt und die Werte werden in die neue Instanz kopiert. Die Referenzzeiger werden auch genauso wie die Werte kopiert. Daher weisen die Verweise auf die Originalobjekte. Alle Änderungen an die Mitglieder, die durch Bezugnahme gespeichert werden, erscheinen sowohl im Original und Kopie, da keine Kopie des referenzierten Objekts gemacht wurde.

In einer tiefen Kopie, die Felder, die von Wert gespeichert sind, werden nach wie vor kopiert, aber die Zeiger auf Objekte durch Referenz gespeichert werden nicht kopiert. Stattdessen wird eine tiefe Kopie des referenzierten Objekts gemacht, und ein Zeiger auf das neue Objekt gespeichert wird. Alle Änderungen, die auf diese referenzierte Objekte gemacht werden keinen Einfluss auf andere Kopien des Objekts.

‚shallowCopy‘ verweist auf die gleiche Stelle im Speicher als ‚Quelle‘ der Fall ist. ‚Deep‘ verweist auf eine andere Stelle im Speicher, aber die Inhalte sind die gleichen.

var source = { firstName="Jane", lastname="Jones" };
var shallow = ShallowCopyOf(source);
var deep = DeepCopyOf(source);
source.lastName = "Smith";
WriteLine(source.lastName); // prints Smith
WriteLine(shallow.lastName); // prints Smith
WriteLine(deep.lastName); // prints Jones

Shallow Cloning:
Definition: „Eine flache Kopie eines Objekts kopiert die‚main‘Objekt, aber kopiert nicht die inneren Objekte.“ Wenn ein benutzerdefiniertes Objekt (z. B. Mitarbeiter) nur primitive hat, Typ String Variablen dann verwenden Sie Shallow Cloning.

Employee e = new Employee(2, "john cena");
Employee e2=e.clone();

Sie kehren super.clone(); in der überschriebenen Methode clone () und Ihre Aufgabe ist vorbei.

Deep Cloning :
Definition: „Im Gegensatz zu der flachen Kopie, eine tiefe Kopie ist eine völlig unabhängige Kopie eines Objekts.“
Bedeutet, wenn ein Objekt Employee ein anderes benutzerdefiniertes Objekt gilt:

Employee e = new Employee(2, "john cena", new Address(12, "West Newbury", "Massachusetts");

Dann müssen Sie den Code schreiben die ‚Adresse‘ Objekt als auch in der überschriebenen Methode clone () zu klonen. Andernfalls wird die Objekt-Adresse wird nicht klonen und es verursacht einen Fehler, wenn Sie Wert von Adresse in Objekt geklonte Mitarbeiter ändern, das auch das Original entspricht.

Deep Copy

Eine tiefe Kopie kopiert alle Felder und erstellt Kopien von dynamisch zugewiesenen Speicher durch die Felder wies auf. Eine tiefe Kopie tritt auf, wenn ein Objekt zusammen mit den Objekten, auf die er sich bezieht kopiert wird.

Shallow Copy

Shallow Kopie ist eine bitweise Kopie eines Objekts. Ein neues Objekt wird erstellt, das eine exakte Kopie der Werte im ursprünglichen Objekt hat. Wenn eines der Felder des Objekts sind Verweise auf andere Objekte, sondern nur die Referenzadressen kopiert das heißt, nur die Speicheradresse kopiert wird.

Shallow Copy - Referenz Variable in Original und Flach kopierten Objekte hat Verweis auf gemeinsames Objekt

.

Deep Copy - Referenz Variable in Original und Tief kopierten Objekte haben Verweis auf anders Objekt

.
  

Klon tut immer flache Kopie.

public class Language implements Cloneable{

    String name;
    public Language(String name){
        this.name=name;
    }

    public String getName() {
        return name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Hauptklasse ist folgende -

public static void main(String args[]) throws ClassNotFoundException, CloneNotSupportedException{

      ArrayList<Language> list=new ArrayList<Language>();
      list.add(new Language("C"));
      list.add(new Language("JAVA"));

      ArrayList<Language> shallow=(ArrayList<Language>) list.clone();
      //We used here clone since this always shallow copied.

      System.out.println(list==shallow);

      for(int i=0;i<list.size();i++)
      System.out.println(list.get(i)==shallow.get(i));//true

      ArrayList<Language> deep=new ArrayList<Language>();
      for(Language language:list){
          deep.add((Language) language.clone());
      }
      System.out.println(list==deep);
      for(int i=0;i<list.size();i++)
          System.out.println(list.get(i)==deep.get(i));//false

} 

Ausgabe von oben wird -

  

false true true

     

false false false

All in ursprünglichem Objekt vorgenommene Änderung im flachen Objekt nicht in tiefem Objekt reflektiert.

  list.get(0).name="ViSuaLBaSiC";
  System.out.println(shallow.get(0).getName()+"  "+deep.get(0).getName());

Nachrichten - VisualBasic- C

Ich mag Beispiel geben, anstatt die formale Definition.

var originalObject = { 
    a : 1, 
    b : 2, 
    c : 3,
};

Dieser Code zeigt eine flache Kopie :

var copyObject1 = originalObject;

console.log(copyObject1.a);         // it will print 1 
console.log(originalObject.a);       // it will also print 1 
copyObject1.a = 4; 
console.log(copyObject1.a);           //now it will print 4 
console.log(originalObject.a);       // now it will also print 4

var copyObject2 = Object.assign({}, originalObject);

console.log(copyObject2.a);        // it will print 1 
console.log(originalObject.a);      // it will also print 1 
copyObject2.a = 4; 
console.log(copyObject2.a);        // now it will print 4 
console.log(originalObject.a);      // now it will print 1

Dieser Code zeigt eine tiefe Kopie :

var copyObject2 = Object.assign({}, originalObject);

console.log(copyObject2.a);        // it will print 1 
console.log(originalObject.a);      // it will also print 1 
copyObject2.a = 4; 
console.log(copyObject2.a);        // now it will print 4 
console.log(originalObject.a);      // !! now it will print 1 !!
struct sample
{
    char * ptr;
}
void shallowcpy(sample & dest, sample & src)
{
    dest.ptr=src.ptr;
}
void deepcpy(sample & dest, sample & src)
{
    dest.ptr=malloc(strlen(src.ptr)+1);
    memcpy(dest.ptr,src.ptr);
}

In einfachen Worten, eine flache Kopie ist ähnlich mit Bezug auf Anrufe und eine tiefe Kopie ist ähnlich Nach Wert Call

In Call By Reference, formale und tatsächliche Parameter einer Funktion bezieht sich auf denselben Speicherplatz und den Wert.

In Call Nach Wert, formale und tatsächliche Parameter einer Funktion bezieht sich auf verschiedene Speicherplatz aber mit dem gleichen Wert.

Stellen Sie sich vor gibt es zwei Arrays arr1 und arr2 genannt.

arr1 = arr2;   //shallow copy
arr1 = arr2.clone(); //deep copy

Shallow Kopieren wird ein neues Objekt zu schaffen und dann die das Kopieren nicht-statischen Felder des aktuellen Objekts auf das neue Objekt. Wenn ein Feld ein Werttyp ist -> eine Bit-für-Bit Kopie des Feldes durchgeführt wird; für einen Referenztyp -> die Referenz kopiert wird, aber das genannte Objekt ist nicht; daher das ursprüngliche Objekt und sein Klon auf das gleiche Objekt beziehen.

Deep Kopie wird ein neues Objekt erstellt und dann das Kopieren der nicht statischen Felder des aktuellen Objekts auf das neue Objekt. Wenn ein Feld ist ein Werttyp -> eine Bit-für-Bit Kopie des Feldes durchgeführt wird. Wenn ein Feld ist ein Referenztyp -> eine neue Kopie des genannten Objekts durchgeführt wird. Die Klassen geklont werden müssen [Serializable] gekennzeichnet werden.

Taken from [blog]: http: // sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html

Deep Kopie beinhaltet den Inhalt eines Objekts unter Verwendung eines anderen Instanz derselben Klasse zu erstellen. In einer tiefen Kopie können die beiden Objekte ht gleichen Informationen enthalten, aber das Zielobjekt seine eigenen Puffer und Ressourcen haben. die Zerstörung der beiden Objekt wird die verbleibende Objekt nicht beeinflussen. Der überladene Zuweisungsoperator eine tiefe Kopie von Objekten schaffen würde.

Shallow Kopie umfasst das Kopieren Sie den Inhalt eines Objekts in eine andere Instanz derselben Klasse somit ein Spiegelbild zu schaffen. Aufgrund gerade Kopieren von Referenzen und Zeiger werden die beiden Objekte teilen die gleiche extern Inhalt des anderen Objekts enthalten ist unberechenbar.

Erklärung:

eine Kopie Konstruktor wir die Datenwerte Glied für Glied einfach kopieren. Diese Methode des Kopierens ist flache Kopie bezeichnet. Wenn das Objekt eine einfache Klasse, bestehend aus eingebauten Typen und keine Zeiger wäre dies akzeptabel sein. Diese Funktion würde die Werte verwenden, und die Objekte und deren Verhalten nicht mit einer flachen Kopie verändert werden würde, nur die Adressen von Zeigern, die Mitglieder sind, werden kopiert und nicht den Wert der Adresse zeigt. Die Datenwerte des Objekts würden dann versehentlich von der Funktion verändert werden. Wenn die Funktion den Gültigkeitsbereich verlässt, wird die Kopie des Objekts mit allen Daten vom Stapel geholt wird.

Wenn das Objekt keine Zeiger hat eine tiefe Kopie muss ausgeführt werden. Mit der tiefen Kopie eines Objekts wird der Speicher für das Objekt im freien Speicher zugewiesen und die Elemente darauf kopiert werden. Eine tiefe Kopie wird für Objekte verwendet, die von einer Funktion zurückgegeben werden.

Um mehr zu anderen Antworten hinzuzufügen,

  • eine flache Kopie eines Objekts führt Kopie von Wert für Werttypen basierend Eigenschaften und Kopie durch eine Referenz für Referenztypen basieren Eigenschaften.
  • eine tiefe Kopie eines Objekts führt durch Wert für Werttypen kopieren basierend sowie Kopie von Wert für Referenztypen Eigenschaften, basierend Eigenschaften tief in der Hierarchie (von Referenztypen)

Eine flache Kopie erstellt ein neues zusammengesetztes Objekt, und legen Sie seine Referenzen in sie auf das ursprüngliche Objekt.

Im Gegensatz zu flacher Kopie, deep baut neue Verbindung Objekt und auch fügt Kopien der ursprünglichen Objekte des ursprünglichen Verbindung Objekts.

Nehmen wir ein Beispiel.

import copy
x =[1,[2]]
y=copy.copy(x)
z= copy.deepcopy(x)
print(y is z)

Über Code druckt FALSE.

Lassen Sie sehen, wie.

Original Verbindung Objekt x=[1,[2]] (als Verbindung bezeichnet, da sie Gegenstand innerhalb Objekts (Inception))

, wie Sie im Bild sehen können, gibt es eine Liste innerhalb Liste.

Dann erstellen wir eine flache Kopie davon mit y = copy.copy(x). Welche Python ist hier der Fall ist, es wird eine neue Verbindung Objekt erstellen, sondern Objekte in ihnen verweisen auf die Orignal-Objekte.

Im Bild hat es eine neue Kopie für die äußeree Liste erstellt. aber die innere Liste bleibt gleich wie das Original.

Nun erstellen wir deep davon mit z = copy.deepcopy(x). was Python hier tut, wird es neues Objekt für äußeree Liste sowie innere Liste erstellen. wie unten in der Abbildung dargestellt (rot markiert).

Am Ende Code druckt False, wie y und z nicht gleiche Objekte.

HTH.

Shallow Kopie wird nicht schaffen neue Referenz, sondern tiefere Kopie wird die neue Referenz erstellen.

Hier ist das Programm der tiefe und flache Kopie zu erklären.

public class DeepAndShollowCopy {
    int id;
    String name;
    List<String> testlist = new ArrayList<>();

    /*
    // To performing Shallow Copy 
    // Note: Here we are not creating any references. 
      public DeepAndShollowCopy(int id, String name, List<String>testlist)
       { 

       System.out.println("Shallow Copy for Object initialization");
       this.id = id; 
       this.name = name; 
       this.testlist = testlist; 

       }
    */  

    // To performing Deep Copy 
    // Note: Here we are creating one references( Al arraylist object ). 
    public DeepAndShollowCopy(int id, String name, List<String> testlist) {
        System.out.println("Deep Copy for Object initialization");
        this.id = id;
        this.name = name;
        String item;
        List<String> Al = new ArrayList<>();
        Iterator<String> itr = testlist.iterator();
        while (itr.hasNext()) {
            item = itr.next();
            Al.add(item);
        }
        this.testlist = Al;
    }


    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Oracle");
        list.add("C++");
        DeepAndShollowCopy copy=new DeepAndShollowCopy(10,"Testing", list);
        System.out.println(copy.toString());
    }
    @Override
    public String toString() {
        return "DeepAndShollowCopy [id=" + id + ", name=" + name + ", testlist=" + testlist + "]";
    }
}

Kopieren ararys:

Array ist eine Klasse, was bedeutet, es Referenztyp ist so array1 = array2 Ergebnisse in zwei Variablen, die den gleichen Referenz-Array.

Aber schauen Sie sich dieses Beispiel:

  static void Main()
    {
        int[] arr1 = new int[] { 1, 2, 3, 4, 5 }; 
        int[] arr2 = new int[] { 6, 7, 8, 9, 0 };

        Console.WriteLine(arr1[2] + " " + arr2[2]);
        arr2 = arr1;
        Console.WriteLine(arr1[2] + " " + arr2[2]); 
        arr2 = (int[])arr1.Clone();
        arr1[2] = 12;
        Console.WriteLine(arr1[2] + " " + arr2[2]);
    }

flache Klon bedeutet, dass nur der Speicher durch die klonierte Array repräsentiert wird kopiert.

Wenn das Array Werttyp-Objekte enthält, werden die Werte kopiert ;

, wenn das Array Referenztyp enthält, werden nur die Referenzen kopiert - so als Folge gibt es zwei Arrays, deren Mitglieder verweisen auf die gleichen Objekte .

Um einen tiefen Kopie-where Referenztyp erstellen dupliziert, Sie Schleife durch das Array muss und jedes Element klonen manuell.

zu den vor allem Definitionen Hinzufügen einer mehr und am häufigsten verwendeten tiefen Kopie ist in dem Copykonstruktor (oder Zuweisung oprator Überlastung) der Klasse.

Shallow Kopie -> ist, wenn Sie nicht Copykonstruktor bereitstellt. Hier wird nur das Objekt kopiert wird, aber nicht alle Mitglieder der Klasse kopiert.

Deep Kopie -.> Ist, wenn Sie sich entschieden haben Copykonstruktor oder Überlastung Zuordnung in Ihrer Klasse zu implementieren und alle Mitglieder der Klasse erlaubt das Kopieren

MyClass& MyClass(const MyClass& obj) // copy constructor for MyClass
{
          // write your code, to copy all the members and return the new object
}
MyClass& operator=(const MyClass& obj) // overloading assignment operator,
{
          // write your code, to copy all the members and return the new object
}

Das Copy-Konstruktor wird verwendet, um das neue Objekt mit dem zuvor erstellten Objekt der gleichen Klasse zu initialisieren. Standardmäßig schrieb Compiler eine flache Kopie. Flache Kopie funktioniert gut, wenn die dynamische Speicherzuordnung nicht beteiligt ist, weil, wenn die dynamische Speicherzuordnung beteiligt ist dann beiden Objekte auf den gleichen Speicherplatz in einem Haufen Punkte, daher, dieses Problem zu beseitigen wir tiefere Kopie, so dass beiden Objekte haben ihre eigene Kopie von Attributen geschrieben in einem Speicher. Um die Details mit vollständigen Beispielen und Erläuterungen zu lesen Sie den Artikel sehen können C ++ Konstruktoren .

Um nur ein wenig mehr für Verwirrung zwischen flache Kopie hinzuzufügen und einfach einen neuen Variablennamen zuweisen aufzulisten.

"Sagen wir:

x = [
    [1,2,3],
    [4,5,6],
    ]

Diese Anweisung erstellt 3 Listen: 2 innere Listen und eine äußere Liste. Ein Verweis auf die äußere Liste wird dann unter dem Namen x zur Verfügung gestellt. Wenn wir das tun

y = x

werden keine Daten kopiert. Wir haben immer noch die gleichen drei Listen im Speicher irgendwo. All dies hat die äußere Liste unter dem Namen y zur Verfügung stellen, zusätzlich zu seinem früheren Namen x. Wenn wir das tun

y = list(x)

oder

y = x[:]

Dies erzeugt eine neue Liste mit dem gleichen Inhalt wie x. Liste x enthielt einen Verweis auf die 2 inneren Listen, so dass die neue Liste wird auch einen Verweis auf die gleichen 2 inneren Listen enthalten. Nur eine Liste kopiert-die äußere Liste. Nun gibt es vier Listen im Speicher, die beiden inneren Listen, die äußere Liste, und die Kopie der äußeren Liste. Die ursprüngliche äußerte Liste ist unter dem Namen x zur Verfügung, und die neue Außen Liste wird unter dem Namen y zur Verfügung gestellt.

Die inneren Listen nicht kopiert! Sie können die inneren Listen von entweder x oder y an dieser Stelle zugreifen und diese bearbeiten!

Wenn Sie eine zweidimensionale (oder höher) Liste haben, oder irgendeine Art von verschachtelter Datenstruktur, und Sie wollen eine vollständige Kopie von allem machen, dann Sie die deep () Funktion im Kopiermodul verwenden mögen. Ihre Lösung funktioniert auch für 2-D-Listen, wie iteriert über die Elemente in der äußeren Liste und erstellt eine Kopie eines jeden von ihnen, dann baut eine neue äußere Liste für alle inneren Kopien. "

Quelle: https://www.reddit.com/r/ learnpython / Kommentare / 1afldr / why_is_copying_a_list_so_damn_difficult_in_python /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top