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.
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.
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]]
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]]
Salinan cetek berguna apabila anda tahu anda tidak perlu mengubah suai objek bersarang. Ia lebih pantas dan menggunakan kurang memori berbanding salinan dalam.
Dalam JavaScript, jika anda menggunakan Array.slice() atau Object.assign(), anda sedang membuat salinan cetek!
Salinan dalam menyalin semua peringkat objek, menduplikasi walaupun struktur bersarang. Ini bermakna sebarang perubahan yang dibuat pada salinan tidak akan menjejaskan objek asal.
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]]
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]]
Jika anda bekerja dengan struktur data yang kompleks atau bersarang, salinan dalam ialah pilihan paling selamat untuk mengelakkan kesan sampingan yang tidak diingini.
Dalam Python, copy.deepcopy() ialah rakan anda apabila anda perlu menduplikasi objek kompleks dengan selamat.
Berikut ialah perbandingan langsung antara salinan cetek dan salinan dalam:
Característica | Shallow Copy | Deep Copy |
---|---|---|
Copia superficial | Sí | No |
Copia profunda | No | Sí |
Modificaciones al objeto original afectan la copia | Sí | No |
Complejidad | Baja | Alta |
Recuerda, una shallow copy es más rápida, pero una deep copy es más segura cuando trabajas con objetos complejos.
¡Las shallow copies son geniales para duplicar configuraciones de aplicaciones ligeras o datos temporales!
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.
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] (¡No esperado!)
Siempre verifica si tu objeto tiene niveles anidados antes de decidir entre una shallow o deep copy.
const originalObject = { a: 1, b: { c: 2 } }; const shallowCopy = Object.assign({}, originalObject);
const originalArray = [1, 2, 3]; const shallowCopy = [...originalArray];
const originalObject = { a: 1, b: { c: 2 } }; const deepCopy = structuredClone(originalObject);
structuredClone() es perfecto para copiar estructuras complejas o circulares sin romper tu cabeza.
const _ = require('lodash'); const originalObject = { a: 1, b: { c: 2 } }; const deepCopy = _.cloneDeep(originalObject);
import copy original_list = [1, 2, [3, 4]] shallow_copy = copy.copy(original_list) deep_copy = copy.deepcopy(original_list)
¡En Python, una copia superficial a veces es todo lo que necesitas para evitar cambios accidentales en tus listas!
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.
Sí, debido a que copia menos datos.
Sí, con JSON.parse(JSON.stringify()) o structuredClone().
El objeto original también se verá afectado.
No necesariamente, solo cuando trabajas con estructuras de datos complejas.
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?
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!