Pythonにおける代入、浅いコピー、深いコピーの違い

代入

代入操作では、新しい変数に元のオブジェクトのメモリアドレスが直接割り当てられます。つまり、両方の変数が同じオブジェクトを参照するため、一方を変更するともう一方も影響を受けます。

print("---------------------------代入------------------------------")
# 代入操作では、新しい変数に元のオブジェクトのメモリアドレスが直接割り当てられます

src_list = [10, 20, 30]

assigned_list = src_list

print(src_list, assigned_list)  # [10, 20, 30] [10, 20, 30]

# 両方の変数が同じアドレスを指しているため、一方のデータを変更するともう一方も変わります
src_list[0] = 99

print(src_list, assigned_list)  # [99, 20, 30] [99, 20, 30]

print(id(src_list), id(assigned_list))  # 140123456789024 140123456789024

print(src_list is assigned_list)  # True

浅いコピー

浅いコピーは、`copy()` メソッドの使用か、`copy` モジュールの `copy.copy()` 関数の使用で行えます。ここでは、`copy()` メソッドを用いた例を示します。

print("---------------------------浅いコピー------------------------------")
import copy

original_list = [1, 2, [3, 4]]
shallow_copied_list = original_list.copy()

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

# 浅いコピーでは、元のリストの要素(ここでは整数)を変更してもコピーされたリストには影響しません
original_list[0] = 100
print(original_list, shallow_copied_list)  # [100, 2, [3, 4]] [1, 2, [3, 4]]

# しかし、元のリスト内の可変な要素(ここでは内包リスト)を変更すると、コピーされたリストにも反映されます
original_list[2].append(5)
print(original_list, shallow_copied_list)  # [100, 2, [3, 4, 5]] [1, 2, [3, 4, 5]]

深いコピー

深いコピーは、`copy` モジュールの `deepcopy()` 関数を使用します。この関数は、オブジェクトとその中に含まれるすべてのオブジェクトを再帰的にコピーします。

print("---------------------------深いコピー------------------------------")
import copy

source_data = [1, 2, [3, 4]]
deep_copied_data = copy.deepcopy(source_data)

print(source_data, deep_copied_data)  # [1, 2, [3, 4]] [1, 2, [3, 4]]

# 深いコピーでは、元のデータを変更してもコピーされたデータには影響しません
source_data[0] = 999
print(source_data, deep_copied_data)  # [999, 2, [3, 4]] [1, 2, [3, 4]]

# 元のデータ内の可変な要素を変更しても、コピーされたデータには影響しません
source_data[2].append(5)
print(source_data, deep_copied_data)  # [999, 2, [3, 4, 5]] [1, 2, [3, 4]]

タグ: Python 代入 浅いコピー 深いコピー copyモジュール

6月21日 00:58 投稿