いろは2994865 views
小学算数1197024 views
高校生物550319 views
小学理科717993 views
雑学1472951 views
ヒストリア286133 views
高校日本史190048 views
中学数学622109 views
中学英語809687 views
Computer366100 views

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