Pythonでリストのコピーとディープコピーを理解する

この記事では、Pythonでリストをコピー(シャローコピー)とディープコピーする方法について詳しく解説します。具体的なコード例とその解説、さらに応用例も含めて説明します。

目次

はじめに:リストのコピーとディープコピーとは

Pythonでリストをコピーする方法はいくつかありますが、それらは大きくシャローコピーとディープコピーに分けられます。シャローコピーはリストの表面的なコピーを作成するのに対し、ディープコピーはリスト内のネストされたリストも含めて完全に新しいコピーを作成します。

シャローコピーの特徴

– 表面的なコピーを作成する
– ネストされたリストは参照渡し

ディープコピーの特徴

– 完全な新しいコピーを作成する
– ネストされたリストも新しいオブジェクトとしてコピー

基本的なコピーメソッド

シャローコピー

# シャローコピーの例
original_list = [1, 2, [3, 4]]
copy_list = original_list.copy()  # シャローコピーを作成
# コピーしたリストの要素を変更
copy_list[0] = 0
copy_list[2][0] = 0

print(original_list)  # [1, 2, [0, 4]]
print(copy_list)      # [0, 2, [0, 4]]

このコードでは、`original_list.copy()`メソッドを使用してリストをシャローコピーしています。ただし、ネストされたリスト(`[3, 4]`)は参照渡しのため、`copy_list`を変更すると`original_list`も影響を受けます。

ディープコピー

import copy  # copyモジュールをインポート

# ディープコピーの例
original_list = [1, 2, [3, 4]]
copy_list = copy.deepcopy(original_list)  # ディープコピーを作成

# コピーしたリストの要素を変更
copy_list[0] = 0
copy_list[2][0] = 0

print(original_list)  # [1, 2, [3, 4]]
print(copy_list)      # [0, 2, [0, 4]]

`copy.deepcopy()`関数を使用することで、ネストされたリストも含めて新しいオブジェクトとして完全にコピーされます。

応用例

応用例として以下の三つのケースを考察します。

応用例1:マトリックスの回転

import copy

def rotate_matrix(matrix):
    rotated = copy.deepcopy(matrix)
    for i in range(len(matrix)):
        for j in range(len(matrix[i])):
            rotated[j][len(matrix) - 1 - i] = matrix[i][j]
    return rotated

# 使用例
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("Original:", matrix)
print("Rotated:", rotate_matrix(matrix))

応用例2:辞書内のリストの更新

import copy

def update_dict_list(d):
    updated_dict = copy.deepcopy(d)
    for key, lst in updated_dict.items():
        lst.append(key)
    return updated_dict

# 使用例
d = {'a': [1], 'b': [2]}
print("Original:", d)
print("Updated:", update_dict_list(d))

応用例3:多次元配列の平坦化

from collections.abc import Iterable

def flatten(items):
    """多次元配列を平坦化する"""
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, str):
            for sub_x in flatten(x):
                yield sub_x
        else:
            yield x

# 使用例
nested_list = [1, [2, [3, 4]], 5]
print("Original:", nested_list)
print("Flattened:", list(flatten(nested_list)))

まとめ

Pythonでのリストのコピーにはシャローコピーとディープコピーがあり、それぞれの特性と使用場面を理解することが重要です。また、実用的な応用例を通じて、これらのコピーメソッドがいかに有用かを見てきました。

コメント

コメントする

目次