今回は、Pythonのdeepcopy()と、copy()の違いについて解説していきます。
目次
copyモジュール
copyモジュールには、copy()と、deepcopy()の2つのメソッドがあり、「copy() 浅いコピー」、「deepcopy() 深いコピー」ともいいます。
copy.copy(a)
aの浅い (shallow) コピーを返します。
浅いコピー (shallow copy) の場合、新たな複合オブジェクトを作成し、元のオブジェクト中に見つかったオブジェクトの参照を挿入します。
copy.deepcopy(a)
aの深い (deep) コピーを返します。
深いコピー (deep copy) の場合、新たな複合オブジェクトを作成し、元のオブジェクト中に見つかったオブジェクトのコピーを挿入します。
浅い (shallow) コピーと深い (deep) コピーの違いが関係してくるのは、複合オブジェクトのみになります。
copy()「浅いコピー」
最初に生成するリストaを、二次元配列にします。
a = [[1, 2], [3, 4]]
b = copy.copy(a)
a[1].append(5)
print ("a = %s" % a)
# 出力結果: a = [[1, 2], [3, 4, 5]]
print ("b = %s" % b)
# 出力結果: b = [[1, 2], [3, 4, 5]]
print ("id(a) = %i" % id(a))
# 出力結果: id(a) = 140092728721352
print ("id(b) = %i" % id(b))
# 出力結果: id(b) = 140092728316808
変数aと変数bのIDは異なっていますが、変数bでも、配列の中身が更新されます。
deepcopy()「深いコピー」
同じコードで、copy.copy()から、copy.deepcopy()へ変えます。
import copy
a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
a[1].append(5)
print ("a = %s" % a)
# 出力結果: a = [[1, 2], [3, 4, 5]]
print ("b = %s" % b)
# 出力結果: b = [[1, 2], [3, 4]]
print ("id(a) = %i" % id(a))
# 出力結果: id(a) = 140092840880264
print ("id(b) = %i" % id(b))
# 出力結果: id(b) = 140092728434760
print ("id(a[0]) = %i" % id(a[0]))
# 出力結果: id(a[0]) = 140092840879752
print ("id(b[0]) = %i" % id(b[0]))
# 出力結果: id(b[0]) = 140092728721352
print ("id(a[1]) = %i" % id(a[1]))
# 出力結果: id(a[1]) = 140092728396104
print ("id(b[1]) = %i" % id(b[1]))
# 出力結果: id(b[1]) = 140092867894216
上記のように配列の中まで全てオブジェクトIDが異なります。
エンジニアとして年収アップを目指しませんか!
正社員、フリーランス、派遣、働き方を選べる。
レバテックキャリア
IT・WEB業界に専門の転職支援サービス
登録は簡単、無料相談!
↓↓詳細をご覧になるには画像をクリックしてください↓↓