Shallow Copy vs Deep Copy – Apakah Itu Sebenarnya? - Contoh dengan JavaScript dan Python

王林
Lepaskan: 2024-08-29 06:33:01
asal
446 orang telah melayarinya

pengenalan

Dalam dunia pengaturcaraan, menyalin data adalah tugas biasa. Walau bagaimanapun, tidak semua salinan dicipta sama. Dua istilah yang sering muncul ialah salinan cetek dan salinan dalam. Memahami perbezaan antara mereka adalah penting untuk mengelakkan ralat yang sukar dikesan.

Apakah Salinan Cetek?

Salinan cetek hanya menyalin tahap pertama objek, meninggalkan rujukan kepada data asal pada tahap yang lebih mendalam. Ini bermakna jika objek asal mempunyai objek lain di dalamnya (bersarang), salinan cetek hanya akan menyalin rujukan kepada objek tersebut, bukan objek itu sendiri.

Contoh dalam 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]]
Salin selepas log masuk

Contoh dalam 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]]
Salin selepas log masuk

Petua:

Salinan cetek berguna apabila anda tahu anda tidak perlu mengubah suai objek bersarang. Ia lebih pantas dan menggunakan kurang memori berbanding salinan dalam.

Nota:

Dalam JavaScript, jika anda menggunakan Array.slice() atau Object.assign(), anda sedang membuat salinan cetek!

Apakah Salinan Dalam?

Salinan dalam menyalin semua peringkat objek, menduplikasi walaupun struktur bersarang. Ini bermakna sebarang perubahan yang dibuat pada salinan tidak akan menjejaskan objek asal.

Contoh dalam 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]]
Salin selepas log masuk

Contoh dalam 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]]
Salin selepas log masuk

Petua:

Jika anda bekerja dengan struktur data yang kompleks atau bersarang, salinan dalam ialah pilihan paling selamat untuk mengelakkan kesan sampingan yang tidak diingini.

Nota:

Dalam Python, copy.deepcopy() ialah rakan anda apabila anda perlu menduplikasi objek kompleks dengan selamat.

Perbandingan Langsung: Salinan Cetek lwn Salinan Dalam

Berikut ialah perbandingan langsung antara salinan cetek dan salinan dalam:

Característica Shallow Copy Deep Copy
Copia superficial No
Copia profunda No
Modificaciones al objeto original afectan la copia No
Complejidad Baja Alta

Tip:

Recuerda, una shallow copy es más rápida, pero una deep copy es más segura cuando trabajas con objetos complejos.

Casos de Uso Comunes

Cuándo Usar Shallow Copy

  • Cuando trabajas con objetos o estructuras de datos simples.
  • Cuando necesitas mejorar el rendimiento y las modificaciones profundas no son un problema.
  • Ejemplos: Configuraciones de aplicaciones, duplicación de datos temporales.

Cuándo Usar Deep Copy

  • Cuando trabajas con estructuras de datos anidadas o complejas.
  • Cuando necesitas asegurarte de que los cambios en la copia no afecten el original.
  • Ejemplos: Manipulación de datos complejos, aplicaciones que requieren alta seguridad y consistencia.

Nota:

¡Las shallow copies son geniales para duplicar configuraciones de aplicaciones ligeras o datos temporales!

Problemas Comunes y Cómo Evitarlos

Problemas con Shallow Copy

Un error común es usar una shallow copy en lugar de una deep copy cuando los datos son anidados. Esto puede llevar a modificaciones no deseadas en el objeto original.

Ejemplo:

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

shallowCopy[2][0] = 99;

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

Tip:

Siempre verifica si tu objeto tiene niveles anidados antes de decidir entre una shallow o deep copy.

Herramientas y Funciones para Realizar Copias en JavaScript

Uso de Object.assign() para Shallow Copy

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

Uso de ...spread para Shallow Copy

const originalArray = [1, 2, 3];
const shallowCopy = [...originalArray];
Salin selepas log masuk

Uso de structuredClone() para Deep Copy

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

Tip:

structuredClone() es perfecto para copiar estructuras complejas o circulares sin romper tu cabeza.

Uso de Librerías como Lodash para Deep Copy

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

Herramientas y Funciones para Realizar Copias en Python

Uso del Módulo copy

import copy

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

Diferencias entre copy.copy() y copy.deepcopy()

  • copy.copy(): Shallow copy.
  • copy.deepcopy(): Deep copy.

Nota:

¡En Python, una copia superficial a veces es todo lo que necesitas para evitar cambios accidentales en tus listas!

Resumen y Conclusión

En resumen, tanto las shallow copies como las deep copies tienen sus usos. La clave es entender la estructura de los datos con los que estás trabajando y elegir el método de copia adecuado.

FAQs

1. ¿Es shallow copy siempre más rápida que deep copy?

Sí, debido a que copia menos datos.

2. ¿Se puede hacer una deep copy sin librerías externas en JavaScript?

Sí, con JSON.parse(JSON.stringify()) o structuredClone().

3. ¿Qué sucede si intento modificar un objeto anidado en una shallow copy?

El objeto original también se verá afectado.

4. ¿Es mejor usar siempre deep copy para evitar problemas?

No necesariamente, solo cuando trabajas con estructuras de datos complejas.

5. ¿Qué ventajas tiene structuredClone() frente a otros métodos de deep copy en JavaScript?

Es nativo, soporta estructuras circulares y es más eficiente que JSON.parse(JSON.stringify()), además de que permite transferir por completo los valores de un objeto a otro.


¡Los errores al usar copias superficiales en lugar de profundas son más comunes de lo que piensas! Espero que esta pequeña guía te ayude a evitar cualquier problema a la hora de copiar datos.

Déjame saber en los comentarios, ¿ya conocías las deep y shallow copies y has tenido problema alguna vez debido a ellas?


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

La libreta de BYXN ? | Substack

¡Mi libreta de apuntes pública! ???. Click to read La libreta de BYXN ?, a Substack publication. Launched 17 days ago.

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

Photo by Mohammad Rahmani on Unsplash

Atas ialah kandungan terperinci Shallow Copy vs Deep Copy – Apakah Itu Sebenarnya? - Contoh dengan JavaScript dan Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan