sec02 - Pythonでsetをコピーする方法|安全で正しい複製テクニック
スポンサーリンク

Pythonのsetコピー時に注意すべきポイント

setをB = Aのような形でコピーした後、どちらかの変数で要素を変更した場合、他方の変数の出力にも影響が及びます。これは、同じsetを参照するようになるからです。

A = {1, 2, 3}

B = A
B.add(99)

print(A, id(A))   # {99, 1, 2, 3} 1724884493120
print(B, id(B))   # {99, 1, 2, 3} 1724884493120

Python set.copy()メソッドの使い方(シャローコピー)

setは要素の順番を保持しないため、listのようなスライスを使うことはできません。安全にsetをコピーしたい場合は、copy()メソッドを使用します。

A = {1, 2, 3}

B = A.copy()
B.add(99)

print(A, id(A))   # {1, 2, 3} 1731857326912
print(B, id(B))   # {99, 1, 2, 3} 1731857326240

copy()メソッドを使用することで、変数Aと変数Bは異なるsetオブジェクトを参照するようになるため、片方の変数で要素を追加するなどの変更を加えても、他方には影響しません。

スポンサーリンク

PythonにおけるsetのDeepcopyは必要か?

setは、変更可能なオブジェクトを要素として持つことはできず、代入時にエラーになります。これは、直接listなどを要素とする場合はもちろん、tupleの中にlistがある場合など間接的なケースでも、setは変更可能なオブジェクトを要素として持てません。

ですので、setの場合はネストされたケースを考える必要はなく、Deepcopyを行う必要はありません。

スポンサーリンク