プログラミングの世界では、データのコピーは一般的なタスクです。ただし、すべてのコピーが同じように作成されるわけではありません。よく現れる 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() が味方になります。
これは、浅いコピーと深いコピーの直接の比較です:
特徴 | 浅いコピー | ディープコピー |
---|---|---|
浅いコピー | うん | いいえ |
ディープコピー | いいえ | うん |
元のオブジェクトへの変更はコピーに影響します | うん | いいえ |
複雑 | 低い | 高い |
浅いコピーの方が高速ですが、複雑なオブジェクトを扱う場合は深いコピーの方が安全であることに注意してください。
浅いコピーは、軽量のアプリケーション設定や一時データを複製するのに最適です!
よくある間違いは、データがネストされているときに深いコピーではなく浅いコピーを使用することです。これにより、元のオブジェクトに望ましくない変更が加えられる可能性があります。
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] (¡No esperado!)
浅いコピーか深いコピーかを決定する前に、オブジェクトにネストされたレベルがあるかどうかを必ず確認してください。
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);
structurdClone() は、頭を悩ませることなく複雑な構造や循環構造をコピーするのに最適です。
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)
Python では、リストへの誤った変更を避けるために、必要なのは浅いコピーだけである場合があります!
要約すると、浅いコピーと深いコピーの両方に用途があります。重要なのは、作業しているデータの構造を理解し、適切なコピー方法を選択することです。
はい、コピーされるデータが少なくなるためです。
はい、JSON.parse(JSON.stringify()) または StructuredClone() を使用します。
元のオブジェクトも影響を受けます。
必ずしもそうとは限りませんが、複雑なデータ構造を扱う場合に限ります。
これはネイティブであり、循環構造をサポートし、JSON.parse(JSON.stringify()) よりも効率的であり、さらに値をあるオブジェクトから別のオブジェクトに完全に転送できます。
深いコピーではなく浅いコピーを使用するときの間違いは、思っているよりもよくあります。この小さなガイドが、データをコピーする際の問題を回避するのに役立つことを願っています。
コメントで知らせてください。ディープ コピーとシャロー コピーについては既にご存知でしたか、それらが原因で問題が発生したことがありますか?
Unsplash の Mohammad Rahmani による写真
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3