[Python3] 浅いコピーと深いコピーを速攻で理解する

本記事の前にそもそもコピーをどうやってやるのかが不明瞭な方は別記事(オブジェクトのコピー方法)をまずはご参照下さい。

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']  # コピー先は変わっていない
sponsor