„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Shallow Copy vs. Deep Copy – Was ist das wirklich? - Beispiele mit JavaScript und Python

Shallow Copy vs. Deep Copy – Was ist das wirklich? - Beispiele mit JavaScript und Python

Veröffentlicht am 31.08.2024
Durchsuche:601

Einführung

In der Programmierwelt ist das Kopieren von Daten eine häufige Aufgabe. Allerdings sind nicht alle Kopien gleich. Zwei häufig vorkommende Begriffe sind Shallow Copy und Deep Copy. Es ist entscheidend, den Unterschied zwischen ihnen zu verstehen, um Fehler zu vermeiden, die schwer zu erkennen sein können.

Was ist eine flache Kopie?

Eine flache Kopie kopiert nur die erste Ebene eines Objekts und hinterlässt Verweise auf die Originaldaten auf tieferen Ebenen. Das bedeutet, dass, wenn das ursprüngliche Objekt andere Objekte enthält (verschachtelt), beim flachen Kopieren nur die Verweise auf diese Objekte kopiert werden, nicht die Objekte selbst.

Beispiel in JavaScript

const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]]
console.log(shallowCopy);   // [1, 2, [99, 4]]

Beispiel in Python

import copy

original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)

shallow_copy[2][0] = 99

print(original_list)  # [1, 2, [99, 4]]
print(shallow_copy)   # [1, 2, [99, 4]]

Tipp:

Eine flache Kopie ist nützlich, wenn Sie wissen, dass Sie verschachtelte Objekte nicht ändern müssen. Es ist schneller und verbraucht weniger Speicher als eine tiefe Kopie.

Notiz:

Wenn Sie in JavaScript Array.slice() oder Object.assign() verwenden, führen Sie eine flache Kopie durch!

Was ist eine Deep Copy?

Eine tiefe Kopie kopiert alle Ebenen eines Objekts und dupliziert sogar verschachtelte Strukturen. Dies bedeutet, dass an der Kopie vorgenommene Änderungen keine Auswirkungen auf das Originalobjekt haben.

Beispiel in JavaScript

const originalArray = [1, 2, [3, 4]];
const deepCopy = JSON.parse(JSON.stringify(originalArray));

deepCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [3, 4]]
console.log(deepCopy);      // [1, 2, [99, 4]]

Beispiel in Python

import copy

original_list = [1, 2, [3, 4]]
deep_copy = copy.deepcopy(original_list)

deep_copy[2][0] = 99

print(original_list)  # [1, 2, [3, 4]]
print(deep_copy)      # [1, 2, [99, 4]]

Tipp:

Wenn Sie mit komplexen oder verschachtelten Datenstrukturen arbeiten, ist Deep Copy die sicherste Option, um unerwünschte Nebenwirkungen zu vermeiden.

Notiz:

In Python ist copy.deepcopy() Ihr Freund, wenn Sie komplexe Objekte sicher duplizieren müssen.

Direkter Vergleich: Shallow Copy vs. Deep Copy

Hier ist ein direkter Vergleich zwischen flacher Kopie und tiefer Kopie:

Besonderheit Flache Kopie Deep Copy
Flache Kopie Ja NEIN
Deep Copy NEIN Ja
Änderungen am Originalobjekt wirken sich auf die Kopie aus Ja NEIN
Komplexität Niedrig Hoch

Tipp:

Denken Sie daran, dass eine flache Kopie schneller, eine tiefe Kopie jedoch sicherer ist, wenn Sie mit komplexen Objekten arbeiten.

Häufige Anwendungsfälle

Wann sollte man Shallow Copy verwenden?

  • Wenn Sie mit Objekten oder einfachen Datenstrukturen arbeiten.
  • Wenn Sie die Leistung verbessern müssen und tiefgreifende Änderungen kein Problem darstellen.
  • Beispiele: Anwendungskonfigurationen, temporäre Datenspiegelung.

Wann Sie Deep Copy verwenden sollten

  • Wenn Sie mit verschachtelten oder komplexen Datenstrukturen arbeiten.
  • Wenn Sie sicherstellen müssen, dass Änderungen an der Kopie keine Auswirkungen auf das Original haben.
  • Beispiele: Komplexe Datenmanipulation, Anwendungen, die hohe Sicherheit und Konsistenz erfordern.

Notiz:

Flache Kopien eignen sich hervorragend zum Duplizieren einfacher Anwendungseinstellungen oder temporärer Daten!

Häufige Probleme und wie man sie vermeidet

Probleme mit Shallow Copy

Ein häufiger Fehler besteht darin, bei der Verschachtelung von Daten eine flache Kopie anstelle einer tiefen Kopie zu verwenden. Dies kann zu unerwünschten Änderungen am Originalobjekt führen.

Beispiel:

const originalArray = [1, 2, [3, 4]];
const shallowCopy = originalArray.slice();

shallowCopy[2][0] = 99;

console.log(originalArray); // [1, 2, [99, 4]] (¡No esperado!)

Tipp:

Überprüfen Sie immer, ob Ihr Objekt verschachtelte Ebenen hat, bevor Sie sich zwischen einer flachen oder tiefen Kopie entscheiden.

Tools und Funktionen zum Erstellen von Kopien in JavaScript

Verwenden von Object.assign() für Shallow Copy

const originalObject = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, originalObject);

Verwenden von ...spread für flache Kopie

const originalArray = [1, 2, 3];
const shallowCopy = [...originalArray];

Verwendung von structureClone() für Deep Copy

const originalObject = { a: 1, b: { c: 2 } };
const deepCopy = structuredClone(originalObject);

Tipp:

structuredClone() eignet sich perfekt zum Kopieren komplexer oder kreisförmiger Strukturen, ohne sich den Kopf zu zerbrechen.

Verwendung von Bibliotheken wie Lodash für Deep Copy

const _ = require('lodash');
const originalObject = { a: 1, b: { c: 2 } };
const deepCopy = _.cloneDeep(originalObject);

Tools und Funktionen zum Erstellen von Kopien in Python

Verwendung des Kopiermoduls

import copy

original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)
deep_copy = copy.deepcopy(original_list)

Unterschiede zwischen copy.copy() und copy.deepcopy()

  • copy.copy(): Flache Kopie.
  • copy.deepcopy(): Tiefe Kopie.

Notiz:

In Python reicht manchmal eine flache Kopie aus, um versehentliche Änderungen an Ihren Listen zu vermeiden!

Zusammenfassung und Fazit

Zusammenfassend lässt sich sagen, dass sowohl flache Kopien als auch tiefe Kopien ihren Nutzen haben. Der Schlüssel liegt darin, die Struktur der Daten, mit denen Sie arbeiten, zu verstehen und die geeignete Kopiermethode auszuwählen.

FAQs

1. Ist flaches Kopieren immer schneller als tiefes Kopieren?

Ja, weil weniger Daten kopiert werden.

2. Können Sie in JavaScript eine tiefe Kopie ohne externe Bibliotheken erstellen?

Ja, mit JSON.parse(JSON.stringify()) oder structureClone().

3. Was passiert, wenn ich versuche, ein in einer flachen Kopie verschachteltes Objekt zu ändern?

Das Originalobjekt wird ebenfalls betroffen sein.

4. Ist es besser, immer Deep Copy zu verwenden, um Probleme zu vermeiden?

Nicht unbedingt, nur wenn Sie mit komplexen Datenstrukturen arbeiten.

5. Welche Vorteile hat structureClone() gegenüber anderen Deep-Copy-Methoden in JavaScript?

Es ist nativ, unterstützt zirkuläre Strukturen und ist effizienter als JSON.parse(JSON.stringify()) und ermöglicht darüber hinaus die vollständige Übertragung von Werten von einem Objekt auf ein anderes.


Fehler bei der Verwendung flacher statt tiefer Kopien kommen häufiger vor, als Sie denken! Ich hoffe, dieser kleine Leitfaden hilft Ihnen, Probleme beim Kopieren von Daten zu vermeiden.

Lassen Sie es mich in den Kommentaren wissen. Wussten Sie bereits von tiefen und flachen Kopien und hatten Sie jemals ein Problem damit?


Shallow Copy vs Deep Copy - ¿Qué son realmente? - Ejemplos con JavaScript y Python

BYXNs Notizbuch? | Unterstapel

Mein öffentliches Notizbuch! ???. Klicken Sie hier, um BYXNs Notebook?, eine Substack-Publikation, zu lesen. Vor 17 Tagen gestartet.

Shallow Copy vs Deep Copy - ¿Qué son realmente? - Ejemplos con JavaScript y Python bhyxen.substack.com

Foto von Mohammad Rahmani auf Unsplash

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/bhyxen/shallow-copy-vs-deep-copy-que-son-realmente-ejemplos-con-javascript-y-python-10ja?1 Falls ein Verstoß vorliegt Bitte kontaktieren Sie Study_golang @163.comdelete
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3