本記事の前にそもそもコピーをどうやってやるのかが不明瞭な方は別記事(オブジェクトのコピー方法)をまずはご参照下さい。
Python3における浅いコピーと深いコピーのポイントを以下に集約しました。
- ミュータブルなオブジェクト(リストや辞書など)にしか関係ない話
- 浅いコピーは、1次元(リストであればx[0]、x[1]のレベル)まではコピー元とコピー先で相互に影響しない形でコピーされるが、2次元(x[0][1]など)より深い次元は一方を変更すると他方も変わってしまう。
>>> import copy >>> x = [['a', 'b'], 'c'] >>> y = copy.copy(x) # 浅いコピー >>> x[1] = 'd' # コピー元の1次元目の変数を変更 >>> x [['a', 'b'], 'd'] # コピー元は当然変わっている >>> y [['a', 'b'], 'c'] # コピー先は変わっていない >>> x[0][0] = 'e' # コピー元の2次元目の変数を変更 >>> x [['e', 'b'], 'd'] # コピー元は当然変わっている >>> y [['e', 'b'], 'c'] # コピー先も変わってしまっている!!
- 深いコピーは、全ての次元でコピー元とコピー先で相互に影響しあう事はない。
>>> import copy >>> x = [['a', 'b'], 'c'] >>> y = copy.deepcopy(x) # 深いコピー >>> x[1] = 'd' # コピー元の1次元目の変数を変更 >>> x [['a', 'b'], 'd'] # コピー元は当然変わっている >>> y [['a', 'b'], 'c'] # コピー先は変わっていない >>> x[0][0] = 'e' # コピー元の2次元目の変数を変更 >>> x [['e', 'b'], 'd'] # コピー元は当然変わっている >>> y [['a', 'b'], 'c'] # コピー先は変わっていない