
Table of Contents(目次)
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を行う必要はありません。