辞書にリストがあるときの 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