辞書の値にリストがある場合、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