辞書にリストがあるときの copy と deepcopy - Python

辞書の値にリストがある場合、copy と deepcopy の違いが明らかになります。

import copy

days = {'Monday': 9, 'Tuesday': [1, 2]}

shallow_copy = copy.copy(days)
deep_copy = copy.deepcopy(days)

days['Monday'] = 100
days['Sunday'] = 5
days['Tuesday'].append(3)

print(days)
# {'Monday': 100, 'Tuesday': [1, 2, 3], 'Sunday': 5}

print(shallow_copy)
# {'Monday': 9, 'Tuesday': [1, 2, 3]}

print(deep_copy)
# {'Monday': 9, 'Tuesday': [1, 2]}

一般に、通常の copy は shallow copy と呼ばれます。この記事では

と翻訳し、元データの(値の)変更がコピー先に与える影響を「作用」と言います。これらの用語を使うと、上のコードは次のように解釈できます。

  • 弱いコピーは整数の作用を受けない
  • 強いコピーは整数の作用を受けない
  • 弱いコピーはリストの作用を受ける
  • 強いコピーはリストの作用を受けない

補足:弱いコピーと強いコピーにあるリストの id

オリジナルと shallow copy は同一のリストを「見ています」。

import copy

days = {'Monday': 9, 'Tuesday': [1, 2]}

shallow_copy = copy.copy(days)
deep_copy = copy.deepcopy(days)

print(id(days['Tuesday']))
# 4340730176

print(id(shallow_copy['Tuesday']))
# 4340730176

print(id(deep_copy['Tuesday']))
# 4340731968