「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 浅いコピーと深いコピー – 本当のところは何ですか? - JavaScript と Python を使用した例

浅いコピーと深いコピー – 本当のところは何ですか? - JavaScript と Python を使用した例

2024 年 8 月 31 日に公開
ブラウズ:708

導入

プログラミングの世界では、データのコピーは一般的なタスクです。ただし、すべてのコピーが同じように作成されるわけではありません。よく現れる 2 つの用語は、浅いコピー深いコピーです。検出が難しいエラーを回避するには、これらの違いを理解することが重要です。

浅いコピーとは何ですか?

浅いコピーは、オブジェクトの最初のレベルのみをコピーし、より深いレベルの元のデータへの参照を残します。これは、元のオブジェクトの内部に他のオブジェクトがある (ネストされている) 場合、浅いコピーでは、オブジェクト自体ではなく、それらのオブジェクトへの参照のみがコピーされることを意味します。

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]]

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]]

ヒント:

浅いコピーは、ネストされたオブジェクトを変更する必要がないことがわかっている場合に便利です。ディープ コピーよりも高速で、消費メモリも少なくなります。

注記:

JavaScript で Array.slice() または Object.assign() を使用すると、浅いコピーを実行することになります。

ディープコピーとは何ですか?

ディープコピーは、オブジェクトのすべてのレベルをコピーし、ネストされた構造も複製します。これは、コピーに加えられた変更が元のオブジェクトに影響を与えないことを意味します。

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]]

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]]

ヒント:

複雑なデータ構造またはネストされたデータ構造を操作している場合、望ましくない副作用を回避するには、ディープ コピーが最も安全なオプションです。

注記:

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!)

ヒント:

浅いコピーか深いコピーかを決定する前に、オブジェクトにネストされたレベルがあるかどうかを必ず確認してください。

JavaScriptでコピーを作成するためのツールと関数

浅いコピーに Object.assign() を使用する

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

浅いコピーに ...spread を使用する

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

ディープコピーに StructuredClone() を使用する

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

ヒント:

structurdClone() は、頭を悩ませることなく複雑な構造や循環構造をコピーするのに最適です。

Lodash などのライブラリをディープコピーに使用する

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

Python でコピーを作成するためのツールと関数

コピーモジュールの使用

import copy

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

copy.copy() と copy.deepcopy() の違い

  • copy.copy(): 浅いコピー.
  • copy.deepcopy(): ディープコピー.

注記:

Python では、リストへの誤った変更を避けるために、必要なのは浅いコピーだけである場合があります!

要約と結論

要約すると、浅いコピーと深いコピーの両方に用途があります。重要なのは、作業しているデータの構造を理解し、適切なコピー方法を選択することです。

よくある質問

1. 浅いコピーは常に深いコピーよりも高速ですか?

はい、コピーされるデータが少なくなるためです。

2. JavaScript で外部ライブラリを使用せずにディープ コピーを実行できますか?

はい、JSON.parse(JSON.stringify()) または StructuredClone() を使用します。

3. 浅いコピーにネストされたオブジェクトを変更しようとするとどうなりますか?

元のオブジェクトも影響を受けます。

4. 問題を回避するには、常にディープ コピーを使用する方が良いですか?

必ずしもそうとは限りませんが、複雑なデータ構造を扱う場合に限ります。

5. StructuredClone() には、JavaScript の他のディープ コピー メソッドと比べてどのような利点がありますか?

これはネイティブであり、循環構造をサポートし、JSON.parse(JSON.stringify()) よりも効率的であり、さらに値をあるオブジェクトから別のオブジェクトに完全に転送できます。


深いコピーではなく浅いコピーを使用するときの間違いは、思っているよりもよくあります。この小さなガイドが、データをコピーする際の問題を回避するのに役立つことを願っています。

コメントで知らせてください。ディープ コピーとシャロー コピーについては既にご存知でしたか、それらが原因で問題が発生したことがありますか?


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

BYXNのノート? |サブスタック

私の公開ノート! ???。クリックして、Substack の出版物である BYXN のノートブック? を読んでください。 17日前に発売されました。

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

Unsplash の Mohammad Rahmani による写真

リリースステートメント この記事は次の場所に転載されています: https://dev.to/bhyxen/shallow-copy-vs-deep-copy-que-son-realmente-ejemplos-con-javascript-y-python-10ja?1 侵害がある場合、study_golang @163.comdelete までご連絡ください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3