プログラミングの世界では、データのコピーは一般的なタスクです。ただし、すべてのコピーが同じように作成されるわけではありません。よく登場する 2 つの用語は、浅いコピー と 深いコピー です。検出が難しいエラーを回避するには、これらの違いを理解することが重要です。
浅いコピーは、オブジェクトの最初のレベルのみをコピーし、より深いレベルの元のデータへの参照を残します。これは、元のオブジェクトの内部に他のオブジェクトがある (ネストされている) 場合、浅いコピーはオブジェクト自体ではなく、それらのオブジェクトへの参照のみをコピーすることを意味します。
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]]
浅いコピーは、ネストされたオブジェクトを変更する必要がないことがわかっている場合に便利です。ディープ コピーよりも高速で、消費メモリも少なくなります。
JavaScript で Array.slice() または Object.assign() を使用すると、浅いコピーが実行されます。
ディープコピーは、オブジェクトのすべてのレベルをコピーし、ネストされた構造も複製します。これは、コピーに加えられた変更が元のオブジェクトに影響を与えないことを意味します。
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]]
複雑なデータ構造またはネストされたデータ構造を操作している場合、望ましくない副作用を回避するには、ディープ コピーが最も安全なオプションです。
Python では、複雑なオブジェクトを安全に複製する必要がある場合、copy.deepcopy() が味方になります。
これは、浅いコピーと深いコピーの直接の比較です。
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
以上がシャローコピーとディープコピー – それらは実際には何ですか? - JavaScript と Python を使用した例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。