AI資格ドリル
資格を選ぶ↓

用語比較

浅いコピーと深いコピーの違い(copy.copy と copy.deepcopy)

浅いコピーは、新しい複合オブジェクトを作り、元のオブジェクトの中にあったオブジェクトへの参照を入れます。深いコピーは、新しい複合オブジェクトを作り、中にあるオブジェクトも再帰的にコピーして入れます。

違いは、リストの中にリストがあるような入れ子のとき、内側を変更すると元にも見えるかどうかに出ます。内側まで別物にするなら深いコピー、外側だけ新しくするなら浅いコピーと覚えると、選択肢を整理できます。

このページは、Python公式ドキュメントのcopyモジュールの説明をもとに、コピーの範囲・内側の変更・書き方・注意点で比べます。例は、説明用の架空のコードです。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。

結論

浅いコピー(copy.copy)

新しい複合オブジェクトを作り、元の中にあるオブジェクトへの参照を入れる。内側は元と共有される。

深いコピー(copy.deepcopy)

新しい複合オブジェクトを作り、中にあるオブジェクトも再帰的にコピーして入れる。

見分け方

入れ子の内側を変更して元に影響するなら浅いコピー、影響しないなら深いコピー。

違いを表で確認

比較軸浅いコピー(copy.copy)深いコピー(copy.deepcopy)
コピーの範囲浅いコピー:外側の複合オブジェクトだけを新しく作り、中身は元のオブジェクトへの参照深いコピー:中にあるオブジェクトも再帰的にコピーして入れる
内側を変更したとき浅いコピー:内側のオブジェクトは共有されるので、元からも変更が見える深いコピー:内側も別のオブジェクトなので、元には影響しない
書き方浅いコピー:copy.copy(obj)。list.copy()、dict.copy()、set.copy() や、シーケンスの全体のスライス a[:] でも作れる深いコピー:copy.deepcopy(obj)
違いが関係する対象浅いコピー:リストやクラスインスタンスのような、他のオブジェクトを含む複合オブジェクトだけで違いが出る深いコピー:同じく複合オブジェクトだけで違いが出る
注意点浅いコピー:代入と違い新しい複合オブジェクトができるが、内側の共有に気づかないと意図しない変更が起きる深いコピー:自分自身への参照を含むオブジェクトで再帰ループが起き得る。共有するつもりのデータも余分にコピーする

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

b = a と浅いコピーを同じものだと思っている人

公式ドキュメントは、Pythonの代入文はオブジェクトをコピーせず、ターゲットとオブジェクトの間に束縛を作ると述べます。浅いコピーは新しい複合オブジェクトを作る点で、代入とは別です。

02

a[:] や list.copy() で入れ子のリストも複製できたと思っている人

公式ドキュメントは、list.copy() や全体のスライスで浅いコピーを作れると述べます。入れ子の内側は参照のままなので、内側の変更は元にも見えます。内側まで別にしたいときは、copy.deepcopy() を使います。

03

深いコピーなら常に安全だと思っている人

公式ドキュメントは、深いコピーには再帰的なオブジェクトで再帰ループが起き得ることと、共有するつもりだったデータも余分にコピーすることの2つの問題があると述べます。deepcopy() は、既にコピーしたオブジェクトを記録するmemo辞書の保持などで、これらを避けています。

具体例で使い分ける

例 1

入れ子のリストを浅いコピーして内側を変更する場合(架空のコード)

a = [[1, 2], [3, 4]] に b = copy.copy(a) とし、b[0].append(9) を実行してから a を表示します。

  • copy.copy(a) は新しい外側のリストを作りますが、中の [1, 2] と [3, 4] は a と同じオブジェクトへの参照です。
  • b[0] は a[0] と同じリストなので、append(9) の結果は a からも見えます。

結論: a は [[1, 2, 9], [3, 4]] になります。

例 2

入れ子のリストを深いコピーして内側を変更する場合(架空のコード)

a = [[1, 2], [3, 4]] に b = copy.deepcopy(a) とし、b[0].append(9) を実行してから a を表示します。

  • copy.deepcopy(a) は、中の [1, 2] と [3, 4] も再帰的にコピーします。
  • b[0] は a[0] とは別のリストなので、append(9) は a に影響しません。

結論: a は [[1, 2], [3, 4]] のままです。

例 3

外側の要素を入れ替える場合(架空のコード)

a = [[1, 2], [3, 4]] に b = copy.copy(a) とし、b[0] = [7, 8] と代入してから a を表示します。

  • b[0] = [7, 8] は、b という新しい外側のリストの要素を差し替える操作です。
  • 内側のリストを変更したのではないので、a の [1, 2] は変わりません。

結論: a は [[1, 2], [3, 4]] のままです。内側を変更する操作と、外側の要素を差し替える操作は区別します。

問題文から答えを選ぶ手順

  1. 1

    対象が複合オブジェクトかを見る

    リストのように他のオブジェクトを含むものでなければ、浅い・深いの違いは出ません。

  2. 2

    入れ子かを見る

    リストの中にリストがあるなど、内側のオブジェクトがあるかを確認します。

  3. 3

    変更の位置を見る

    内側のオブジェクトを変更するのか、外側の要素を差し替えるのかを区別します。

  4. 4

    コピーの種類を見る

    copy.copy()・list.copy()・a[:] は浅いコピー、copy.deepcopy() は深いコピーです。

試験での見分け方

  • 1浅いコピーは新しい複合オブジェクトを作り、元の中にあるオブジェクトへの参照を入れる。
  • 2深いコピーは新しい複合オブジェクトを作り、中にあるオブジェクトを再帰的にコピーして入れる。
  • 3違いが出るのは、他のオブジェクトを含む複合オブジェクトだけ。
  • 4list.copy()、dict.copy()、set.copy()、a[:] は浅いコピーを作る。
  • 5代入はオブジェクトをコピーしない。

誤答しやすい選択肢

浅いコピーなら内側も別物になると考える

修正: 浅いコピーでは内側は元と同じオブジェクトへの参照です。内側の変更は元からも見えます。

外側の要素の差し替えが、元に影響すると考える

修正: 浅いコピーの外側は新しいオブジェクトです。要素を差し替えても元は変わりません。影響するのは内側の変更です。

深いコピーに問題はないと考える

修正: 再帰ループが起き得ることと、共有するつもりのデータも余分にコピーすることが、公式ドキュメントに挙げられています。

確認問題

Q1浅いコピーは、元のオブジェクトの中にあったオブジェクトをどう扱いますか?

答え: 参照を入れる(コピーしない)

新しい複合オブジェクトを作り、可能な限り元の中にあるオブジェクトへの参照を挿入します。

Q2中のオブジェクトまで再帰的にコピーする関数は?

答え: copy.deepcopy()

深いコピーは、元に含まれるオブジェクトを再帰的にコピーして挿入します。

Q3a = [[1, 2], [3, 4]] に対して b = a[:] とし、b[0].append(9) を実行すると、a[0] はどうなりますか?

答え: [1, 2, 9] になる

a[:] は浅いコピーで、内側のリストは a と共有されるためです。

到達チェック

  • 浅いコピーと深いコピーの違いを言える
  • 違いが出る対象が複合オブジェクトであることを言える
  • list.copy() と a[:] が浅いコピーであることを言える
  • 内側の変更と外側の差し替えを区別できる

同じ資格で次に知りたいこと

よくある質問

Q浅いコピーと深いコピーの違いは?

A

浅いコピーは中のオブジェクトへの参照を入れ、深いコピーは中のオブジェクトも再帰的にコピーします。

Qlist.copy() は浅いコピーですか?

A

公式ドキュメントは、list.copy() などのcopy()メソッドや全体のスライスで浅いコピーを作れると述べます。

Qリストが入れ子でなければ違いはありますか?

A

公式ドキュメントは、違いが関係するのは他のオブジェクトを含む複合オブジェクトだけと述べます。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)