Was ist der Unterschied zwischen einer tiefen Kopie und einer flachen Kopie?
Was ist der Unterschied zwischen einer tiefen Kopie und eine flache Kopie?
InformationsquelleAutor der Frage David Locke | 2008-10-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Flache Kopien duplizieren, so wenig wie möglich. Eine flache Kopie einer Sammlung wird eine Kopie der collection-Struktur, die Elemente nicht. Mit einer flachen Kopie, zwei Kollektionen teilen sich nun die einzelnen Elemente.
Tiefe Kopien duplizieren alles. Eine Tiefe Kopie einer Sammlung wird zwei Sammlungen, die mit allen Elementen in der ursprünglichen Sammlung dupliziert.
InformationsquelleAutor der Antwort S.Lott
Breite vs Tiefe; denken in einem Baum von Referenzen mit Ihr Objekt als Wurzelknoten.
Flach:
Den Variablen A und B beziehen sich auf verschiedene Bereiche des Speichers, wenn B Eine Zuordnung zu einer der beiden Variablen beziehen sich auf den gleichen Bereich im Speicher. Spätere änderungen der Inhalte werden entweder sofort in die Inhalte der anderen, wie Sie Inhalte teilen.
Tiefe:
Den Variablen A und B beziehen sich auf verschiedene Bereiche des Speichers, wenn B zugeordnet wird, die Werte in den Speicher-Bereich, die Punkte sind kopiert in den Speicher-Bereich, um die B-Punkte. Spätere änderungen der Inhalte entweder bleiben Sie einzigartig auf A oder B; die Inhalte werden nicht geteilt.
InformationsquelleAutor der Antwort dlamblin
Kurz gesagt, es hängt davon ab, welche Punkte für was. In eine flache Kopie, Objekt B zeigt auf Ein Objekt die Position im Speicher. In der Tiefe Kopie, alle Dinge in Ein Objekt den Speicherbereich kopiert, auf Objekt B Speicher-Speicherort.
Dieser wiki-Artikel hat ein tolles Diagramm.
http://en.wikipedia.org/wiki/Object_copy
InformationsquelleAutor der Antwort helloandre
Vor allem Für iOS-Entwickler:
Wenn
B
ist ein flache Kopie vonA
dann für primitive Daten, wieB = [A assign];
und für Objekte es ist wieB = [A retain]
;B-und A-Punkt auf der gleichen Speicherstelle
Wenn
B
ist ein Tiefe Kopie vonA
dann ist es soB = [A copy];
B-und A-Punkt auf verschiedene Speicherplätze
B Speicher-Adresse ist die gleiche wie Eine s
B hat den gleichen Inhalt wie Eine s
InformationsquelleAutor der Antwort Abhishek Bedi
Flache Kopie: Kopien der member die Werte von einem Objekt in ein anderes.
Tiefe Kopie: Kopien der member die Werte von einem Objekt in ein anderes.
Jedes Zeiger-Objekte werden dupliziert und Tiefen Kopiert.
Beispiel:
InformationsquelleAutor der Antwort Martin York
Versuchen Sie, betrachten Sie Folgendes Bild
Beispielsweise Objekt.MemberwiseClone schafft eine flachen kopieren link
und mit ICloneable Schnittstelle, die Sie bekommen können tief kopieren, wie beschrieben, hier
InformationsquelleAutor der Antwort Alexandr
Ich noch nicht gesehen, eine kurze, leicht verständliche Antwort-so werde ich es versuchen.
Mit eine flache Kopie, jedes Objekt wies auf die von der Quelle wird auch gezeigt, durch das Ziel (so dass keine referenzierten Objekte kopiert werden).
Mit einer tiefen Kopie, jedes Objekt wies auf die von der Quelle kopiert, und die Kopie wird gezeigt, durch das Ziel (also gibt es jetzt 2 jedes referenzierte Objekt). Dies bezieht down-das Objekt Baum.
InformationsquelleAutor der Antwort Bill K
{Stellen Sie sich zwei Objekte A und B vom selben Typ _t(in Bezug auf C++) und denken Sie daran, seichte/Tiefe kopieren von A nach B}
Flache Kopie:
Macht einfach eine Kopie der Referenz auf A in B. Denken als eine Kopie von Einer Adresse.
So, die Adressen von A und B werden die gleichen sein, d.h. Sie zeigen auf den selben Speicherbereich, d.h. Daten und Inhalten.
Tiefe Kopie:
Macht einfach eine Kopie aller Mitglieder Ein, ordnet Speicher in einen anderen Speicherort für B und weist dann den kopierten Mitglieder, um B zu erreichen, Tiefe Kopie. Auf diese Weise, wenn Eine nicht-existente B ist immer noch gültig in der Erinnerung. Der richtige Begriff zu verwenden, wäre das Klonen, wo Sie wissen, dass Sie beide sind völlig gleich, aber doch anders (D. H. gespeichert, die als zwei unterschiedliche Entitäten in den Speicher). Sie können auch Ihre clone-wrapper, wo können Sie entscheiden Sie über die Aufnahme/Ausschluss-Liste, die Eigenschaften zu wählen, während Tiefe Kopie. Dies ist durchaus eine gängige Praxis beim erstellen von APIs.
Können Sie tun, eine Seichte Kopie ONLY_IF Sie verstehen den Einsätzen beteiligt. Wenn Sie haben eine enorme Anzahl von Zeigern zu beschäftigen, die in C++ oder C, dabei eine flache Kopie eines Objekts ist WIRKLICH eine schlechte Idee.
EXAMPLE_OF_DEEP COPY_ Ein Beispiel ist, wenn Sie versuchen, zu tun Bildverarbeitung und Objekterkennung, müssen Sie die Maske "Irrelevante und sich Wiederholende Bewegung" in den abwicklungsbereichen. Wenn Sie mit Bild-Zeiger, dann könnten Sie die Spezifikation speichern Sie diese Maske Bilder. NUN... wenn Sie tun, eine seichte Kopie des Bildes, wenn der Zeiger verweist GETÖTET werden, vom Stapel, Sie verloren den Bezug und die Kopie heißt, es gibt einen Laufzeit-Fehler der Zugriffsverletzung an einem gewissen Punkt. In diesem Fall, was Sie brauchen, ist eine Tiefe Kopie des Bildes KLONEN. Auf diese Weise können Sie abrufen, die Masken, wenn Sie Sie brauchen in der Zukunft.
EXAMPLE_OF_SHALLOW_COPY ich bin nicht besonders kenntnisreich im Vergleich zu den Nutzern in StackOverflow so fühlen sich frei, um dieses Teil löschen, und setzen Sie ein good Beispiel, wenn Sie klären können. Aber ich glaube wirklich, es ist nicht eine gute Idee, um flache Kopie, wenn Sie wissen, dass Ihr Programm ist gonna führen Sie für eine unendliche Zeit-D. H. die ständige "push-pop" - operation über den stack bei Funktionsaufrufen. Wenn Sie zeigen etwas, um ein amateur-oder novice person (z.B. C/C++ tutorial-Zeug), dann ist es wahrscheinlich okay. Aber wenn Sie eine Anwendung ausführen wie überwachung und detection-system, oder Sonar-Tracking-System, Sie sind eigentlich nicht zu halten seichten kopieren von Objekten um, weil er töten wird, Ihr Programm früher oder später.
InformationsquelleAutor der Antwort ha9u63ar
Nur für die Zwecke der einfachen Verständigung könnten Sie Folgen Sie diesem Artikel:
https://www.cs.utexas.edu/~scottm/cs307/handouts/deepCopying.htm
Flache Kopie:
Tiefe Kopie:
InformationsquelleAutor der Antwort Touchstone
'ShallowCopy" weist auf die gleiche Position im Speicher als 'Quelle' bedeutet.
'DeepCopy' Punkte an eine andere Stelle im Speicher, aber die Inhalte sind die gleichen.
InformationsquelleAutor der Antwort John Dibling
Was ist Flache Kopie?
Flache Kopie ist eine bit-Weise Kopie eines Objekts. Ein neues Objekt wird erstellt, das eine genaue Kopie der Werte in das ursprüngliche Objekt. Wenn Sie die Felder des Objekts sind Referenzen auf andere Objekte, wird nur der Verweis-Adressen kopiert werden, d.h., nur die Speicheradresse kopiert.
In dieser Abbildung, die
MainObject1
Felderfield1
vom Typ int, undContainObject1
TypContainObject
. Wenn Sie tun, eine seichte KopieMainObject1
MainObject2
erstellt mitfield2
mit dem kopierten Wertfield1
und zeigen noch immer zuContainObject1
selbst. Beachten Sie, dass seitfield1
ist der primitive Typ, dessen Wert kopiertfield2
aber daContainedObject1
ist ein Objekt,MainObject2
noch PunkteContainObject1
. So werden änderungenContainObject1
imMainObject1
werden, spiegelt sich inMainObject2
.Nun, ob dies flache Kopie, mal sehen, was tief kopieren?
Was ist Tiefe Kopie?
Eine Tiefe Kopie kopiert alle Felder, und macht Kopien von dynamisch zugewiesenen Speicher hingewiesen, die durch die Felder. Eine Tiefe Kopie tritt auf, wenn ein Objekt kopiert wird zusammen mit den Objekten, auf die es verweist.
In dieser Abbildung, die MainObject1 Felder
field1
vom Typ int, undContainObject1
TypContainObject
. Wenn Sie eine Tiefe Kopie vonMainObject1
MainObject2
erstellt mitfield2
mit dem kopierten Wertfield1
undContainObject2
mit dem kopierten WertContainObject1
. Hinweis alle änderungen anContainObject1
imMainObject1
wird nicht unbedingt inMainObject2
.guter Artikel
InformationsquelleAutor der Antwort atish shimpi
In der Objekt-orientierten Programmierung eine Typ enthält eine Sammlung von member-Bereichen. Diese Felder können gespeichert werden, entweder per Wert oder per Referenz (d.h. ein Zeiger auf einen Wert).
In eine flache Kopie, wird eine neue Instanz des Typs erzeugt und die Werte werden in die neue Instanz kopiert. Die Referenz-Zeiger sind kopiert, nur wie die Werte sind. Daher die Referenzen auf die ursprünglichen Objekte. Änderungen der Mitglieder, die als Verweis gespeichert sind, erscheinen sowohl das original und die Kopie, da keine Kopie gemacht wurde, der das referenzierte Objekt.
In eine Tiefe Kopie, die Felder, die gespeichert werden, durch die der Wert kopiert werden wie vorher, aber die Zeiger auf Objekte als Verweis gespeichert sind, werden nicht kopiert. Stattdessen wird eine Tiefe Kopie des referenzierten Objekts, und einen Zeiger auf das neue Objekt gespeichert ist. Alle änderungen, die auf diese Objekte verwiesen wird, wird nicht auf andere Kopien des Objekts.
InformationsquelleAutor der Antwort Jeffrey L Whitledge
'ShallowCopy" weist auf die gleiche Position im Speicher als 'Quelle' bedeutet. 'DeepCopy' Punkte an eine andere Stelle im Speicher, aber die Inhalte sind die gleichen.
InformationsquelleAutor der Antwort GovindaRaju
InformationsquelleAutor der Antwort Dour High Arch
Flache Kopie- Referenz-variable in original-und flach-kopierten Objekte haben Referenz auf gemeinsamen Objekt.
Tiefe Kopie- Referenz-variable in original und tief kopierten Objekte haben Referenz auf verschiedenen Objekt.
main-Klasse ist folgende-
Ausgabe von oben-
Jede änderung in der Objekt reflektiert in flachen Gegenstand, der nicht in deep-Objekt.
Ausgabe- ViSuaLBaSiC C
InformationsquelleAutor der Antwort
Möchte ich geben beispielsweise eher als die formale definition.
Dieser code zeigt ein flache Kopie:
Dieser code zeigt ein Tiefe Kopie:
InformationsquelleAutor der Antwort Vivek Mehta
InformationsquelleAutor der Antwort notytony
In Einfachen Worten, eine Flache Kopie ist ähnlich wie Call-By-Reference und einer Tiefen Kopie ist ähnlich wie Call-By-Value
Im Call-By-Reference, formale und aktuelle Parameter einer Funktion bezieht sich auf die gleiche Speicheradresse und der Wert.
Im Call-By-Value, formale und aktuelle Parameter von Funktionen bezieht sich auf verschiedene Speicher, aber mit dem gleichen Wert.
InformationsquelleAutor der Antwort santhosh
Shallow Cloning:
Definition: "Eine flache Kopie eines Objekts kopiert die "main" - Objekt, aber nicht kopieren Sie die inneren Objekte."
Wenn ein benutzerdefiniertes Objekt (zB. Mitarbeiter) hat nur primitive, Typ String-Variablen dann verwenden Sie Flache Klonen.
Kehren Sie zurück
super.clone();
in die überschriebene clone () - Methode und Ihre Aufgabe ist es vorbei.Tiefes Klonen:
Definition: "Anders als die flache Kopie, Tiefe Kopie ist eine vollständig unabhängige Kopie eines Objekts."
Bedeutet, wenn ein Mitarbeiter-Objekt enthält ein anderes benutzerdefiniertes Objekt:
Dann müssen Sie den code schreiben, der zum Klonen der 'Address' - Objekt als auch in die überschriebene clone () - Methode. Ansonsten ist die Adresse-Objekt nicht Klonen und es verursacht einen Fehler, wenn Sie ändern Sie den Wert der Adresse in geklonter Mitarbeiter-Objekt, das spiegelt das original zu.
InformationsquelleAutor der Antwort Arun Raaj
Vorstellen, es gibt zwei arrays genannt arr1 und arr2.
InformationsquelleAutor der Antwort PeerNet
Tiefe Kopie
Eine Tiefe Kopie kopiert alle Felder, und macht Kopien von dynamisch zugewiesenen Speicher hingewiesen, die durch die Felder. Eine Tiefe Kopie tritt auf, wenn ein Objekt kopiert wird zusammen mit den Objekten, auf die es verweist.
Flache Kopie
Flache Kopie ist eine bit-Weise Kopie eines Objekts. Ein neues Objekt wird erstellt, das eine genaue Kopie der Werte in das ursprüngliche Objekt. Wenn Sie die Felder des Objekts sind Verweise zu anderen Objekten nur die Referenz-Adressen kopiert werden, d.h., nur die Speicheradresse kopiert.
Tiefe Kopie und schlucken kopieren Beispiel
InformationsquelleAutor der Antwort Sunil Kumar Sahoo
Entnommen aus [blog]: http://sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html
Tiefe Kopie umfasst die Verwendung der Inhalte von einem Objekt zum erstellen einer anderen Instanz der gleichen Klasse. In eine Tiefe Kopie, die zwei Objekte enthalten kann ht gleichen Informationen, aber das Ziel-Objekt hat seine eigenen Puffer und Ressourcen. die Zerstörung des entweder-Objekt wird nicht auf der verbleibenden Objekt. Der überladene Zuweisungsoperator würde erstellen Sie eine Tiefe Kopie von Objekten.
Flache Kopie umfasst das kopieren der Inhalte von einem Objekt in einer anderen Instanz der gleichen Klasse und schafft somit ein Spiegelbild. Aufgrund das direkte kopieren von Referenzen und Zeigern, die beiden Objekte teilen sich den gleichen extern Inhalte der anderen Sache zu unberechenbar.
Erklärung:
Copy-Konstruktor wir Sie einfach kopieren Sie die Daten Werte, die Mitglied von Mitglied. Diese Methode des Kopierens ist die genannte flache Kopie. Wenn das Objekt ist eine einfache Klasse, die aus der eingebauten Typen und keine Zeiger das wäre akzeptabel. Diese Funktion würde die Werte und die Objekte und Ihr Verhalten würde nicht verändert werden, mit eine flache Kopie, nur die Adressen von Zeigern, die Mitglieder sind kopiert und nicht den Wert, den die Adresse verweist. Die Daten, die Werte des Objekts wäre dann versehentlich geändert werden, indem die Funktion. Wenn die Funktion außerhalb des Gültigkeitsbereichs liegt, wird die Kopie von dem Objekt mit all seinen Daten ist spontan aus dem Stapel.
Wenn das Objekt verfügt jeder Zeiger eine Tiefe Kopie ausgeführt werden muss. Mit der Tiefe Kopie eines Objekts, ist der Speicher für das Objekt reserviert im free-Shops und die Elemente hingewiesen werden kopiert. Bei einer tiefen Kopie wird verwendet für Objekte, die von einer Funktion zurückgegeben.
InformationsquelleAutor der Antwort Santosh
Hinzufügen mehr an anderen Antworten,
Eigenschaften, und Kopie von Referenz-Referenz-Typen-basierten Eigenschaften.
Eigenschaften, ebenso wie, Kopie durch den Wert für Referenztypen basiert
Eigenschaften, die tief in der Hierarchie (Referenz-Typen)
InformationsquelleAutor der Antwort VS1
Kopieren ararys :
Array ist eine Klasse, was bedeutet, dass Sie den Typ der Referenz, so array1 = array2 Ergebnisse
in zwei Variablen verweisen auf das gleiche array.
Aber schauen Sie auf dieses Beispiel:
"shallow clone" bedeutet, dass nur die Erinnerung, vertreten durch das geklonte array ist kopiert.
Wenn das array enthält value-type-Objekte, die die Werte kopiert werden;
wenn das array enthält den Typ der Referenz, nur die Referenzen kopiert werden - also als Ergebnis gibt es zwei arrays, deren Mitglieder auf den gleichen Objekten.
Erstellen einer tiefen Kopie—wo den Typ der Referenz dupliziert werden, müssen Sie eine Schleife durch das array und Klon jedes element manuell.
InformationsquelleAutor der Antwort lukaszk
Flachen kopieren ist ein neues Objekt erstellen und dann kopieren die nicht-statischen Felder des aktuellen Objekts in das neue Objekt. Wenn ein Feld einen Wert eingeben --> ein bit-für-bit-Kopie des Feldes durchgeführt wird; für eine Referenz Typ --> die Referenz wird kopiert, aber die genannten Objekts nicht; daher das ursprüngliche Objekt und seinen Klon auf das gleiche Objekt beziehen.
Tief Kopie ist ein neues Objekt erstellen und dann kopieren auf nicht-statische Felder des aktuellen Objekts in das neue Objekt. Wenn ein Feld ist eine Wert Typ --> ein bit-für-bit-Kopie des Feldes durchgeführt wird. Wenn ein Feld ist eine Referenz Typ --> eine neue Kopie von dem genannten Objekt durchgeführt wird. Die Klassen, die geklont werden müssen, werden markiert als [Serializable].
InformationsquelleAutor der Antwort Rajaram Shelar
flache Kopie erstellen keine neue Referenz, aber Tiefe Kopie erstellen wird die neue Referenz.
Hier ist das Programm zu erklären, die Tiefe und flache Kopie
}
InformationsquelleAutor der Antwort Lova Chittumuri
Wird eine flache Kopie erstellt ein neues compound-Objekt, und legen Sie seine Referenzen in es auf das ursprüngliche Objekt.
Anders als shallow copy, deepcopy Konstrukte neues compound-Objekt und fügt Kopien der original-Objekte der ursprünglichen Verbindung-Objekt.
Können ein Beispiel nehmen.
Obige code druckt FALSE.
Lassen Sie sehen, wie.
Original compound-Objekt
x=[1,[2]]
(genannt als Verbindung, weil es Objekt im Objekt (Inception))als Sie es im Bild sehen kann, gibt es eine Liste innerhalb Liste.
Dann erstellen wir eine flache Kopie der es mit
y = copy.copy(x)
. Was python macht hier ist, wird es schaffen ein neues compound-Objekt, sondern Objekte, die innerhalb Sie verweisen auf die ursprünglichen Objekte.In das Bild, das er geschaffen hat, eine neue Kopie für die äußere Liste. aber die innere Liste bleibt die gleiche wie das original.
Nun erstellen wir deepcopy es mit
z = copy.deepcopy(x)
. was python macht hier ist, es wird neues Objekt anlegen für outer-Liste als auch inner Liste. wie im Bild unten gezeigt (rot markiert).Ende code druckt
False
y und z sind nicht die gleichen Objekte.HTH.
InformationsquelleAutor der Antwort Sushant
Zusätzlich zu all den oben genannten Definitionen, eine mehr und die meisten Häufig verwendet, Tiefe Kopie, ist in den copy-Konstruktor (oder überlastung Zuordnung oprator) der Klasse.
Flache Kopie --> ist, wenn Sie nicht die Kopie-Konstruktor. Hier wird nur das Objekt kopiert wird, aber nicht alle Elemente der Klasse kopiert werden.
Tief kopieren --> ist, wenn Sie sich entschieden haben, zu implementieren, copy-Konstruktor oder überlastung Zuordnung in Ihrer Klasse und erlaubt das kopieren von allen Mitgliedern der Klasse.
InformationsquelleAutor der Antwort Avinash Goud N J
Den copy Konstruktor initialisiert das neue Objekt mit den zuvor erstellten Objekts der gleichen Klasse. Standardmäßig compiler schrieb eine flache Kopie. Flache Kopie funktioniert, wenn die dynamische Speicherverwaltung nicht beteiligt ist, weil, wenn die dynamische Speicherverwaltung beteiligt ist, werden dann beide Objekte werden die Punkte auf die gleiche Speicherstelle im heap, Also um dieses problem zu beseitigen schrieben wir tief kopieren, so dass beide Objekte haben Ihre eigene Kopie von Attributen, die in einem Speicher.
Lesen Sie die details mit Beispielen und Erklärungen, die Sie konnte sehen, wie der Artikel C++ - Konstruktoren.
InformationsquelleAutor der Antwort royal52
Hinzufügen nur ein wenig mehr für Verwirrung zwischen flache Kopie und weisen Sie einfach eine neue variable Namen Liste.
"Sagen wir, wir haben:
Diese Anweisung erstellt 3 Listen: 2 innere Listen und eine äußere Liste. Einen Verweis auf die äußere Liste ist dann unter dem Namen x. Wenn wir das tun
keine Daten kopiert. Wir haben immer noch die selben 3 Listen im Speicher irgendwo. All dies Tat der äußeren Liste unter dem Namen y, zusätzlich zu seinen bisherigen Namen x zu. Wenn wir das tun
oder
Dieser erstellt eine neue Liste mit dem gleichen Inhalt wie x. Die x-Liste enthielt einen Verweis auf die 2 innere Listen, so dass die neue Liste enthält auch einen Verweis auf die gleichen 2 innere Listen. Wird nur eine Liste kopiert, die äußere Liste.
Jetzt sind es 4 Listen im Speicher, die beiden inneren Listen, die äußere Liste, und die Kopie der äußeren Liste. Die ursprünglichen äußeren Liste ist verfügbar unter dem Namen x, und die neue äußere Liste ist unter dem Namen y.
Innere Listen wurden nicht kopiert! Sie zugreifen können und Bearbeiten Sie die inneren Listen von entweder x oder y an dieser Stelle!
Wenn Sie einen zwei dimensionalen (oder höher) Liste, oder jede Art von geschachtelten Struktur der Daten, und Sie möchten, um eine vollständige Kopie von allem, dann wollen Sie das deepcopy () - Funktion in das Modul kopieren. Deine Lösung funktioniert auch für 2-D-Listen, iteriert über die Elemente der äußeren Liste und macht eine Kopie von jedem von Ihnen, dann baut sich eine neue äußere Liste für alle die inneren Kopien."
Quelle: https://www.reddit.com/r/learnpython/comments/1afldr/why_is_copying_a_list_so_damn_difficult_in_python/
InformationsquelleAutor der Antwort Lance Ruo Zhang