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