Pythonのcopyについて!
こんにちは、にわこまです。
今回は、pythonのcopyについて紹介していきます。「コピー後のデータに操作したはずなのに、コピー元まで更新されてる」という状況を解決することができます。
誤字脱字など何かございましたらご連絡お願い致します。
スポンサードサーチ
結論
copy.copy()を使ってコピーする。
※2次元配列やオブジェクトをコピーする場合は、copy.deepcopy()を使います。2次元配列は、copy.copy()でコピーできません。deepcopy()はcopy()の上位互換です。
copy.copy()の使い方
import copy
a = [1, 2, 3, 4, 5]
b = copy.copy(a)
print("変化前")
print("a = ", a)
print("b = ", b)
print("")
a.append(6)
print("変化後")
print("a = ", a) # 元データ 6を追加
print("b = ", b) # copy.copy()でコピー
# 実行結果
変化前
a = [1, 2, 3, 4, 5]
b = [1, 2, 3, 4, 5]
変化後
a = [1, 2, 3, 4, 5, 6]
b = [1, 2, 3, 4, 5]
copy.copy()を使わなくてもコピーできるもの
int、str
他には、boolean、complex、float、tuple、range、bytes、file object、etc…
コピーの方法:int
a = 2020
b = a
print("変化前")
print("a = ", a)
print("b = ", b)
print("")
a = 1999
print("変化後")
print("a = ", a)
print("b = ", b)
# 実行結果
変化前
a = 2020
b = 2020
変化後
a = 1999
b = 2020
コピーの方法:str
a = "abc"
b = a
print("変化前")
print("a = ", a)
print("b = ", b)
print("")
a = a + "xyz"
print("変化後")
print("a = ", a)
print("b = ", b)
# 実行結果
変化前
a = abc
b = abc
変化後
a = abcxyz
b = abc
intやstrに関しては、変数を新しいい変数に代入することでコピーすることができます。
スポンサードサーチ
copy.copy()を使わないとコピーできないもの
list、dict、2次元配列
他には、set、bytearray
copyを使わないとコピーできないことの証明
a = [1, 2, 3, 4, 5]
b = a
print("変化前")
print("a = ", a)
print("b = ", b)
print("")
a.append(6)
print("変化後")
print("a = ", a)
print("b = ", b)
# 実行結果
変化前
a = [1, 2, 3, 4, 5]
b = [1, 2, 3, 4, 5]
変化後
a = [1, 2, 3, 4, 5, 6]
b = [1, 2, 3, 4, 5, 6]
変数bに変数aを代入しただけのコピーでは、変数aだけに操作をしても、変数bにもその操作の影響があります。
copy.copy()の使い方:list
import copy
a = [1, 2, 3, 4, 5]
b = copy.copy(a)
print("変化前")
print("a = ", a)
print("b = ", b)
print("")
a.append(6)
print("変化後")
print("a = ", a) # 元データ 6を追加
print("b = ", b) # copy.copy()でコピー
# 実行結果
変化前
a = [1, 2, 3, 4, 5]
b = [1, 2, 3, 4, 5]
変化後
a = [1, 2, 3, 4, 5, 6]
b = [1, 2, 3, 4, 5]
listをcopy.copy()を使わずコピーする方法
sliceを使う。
sliceを使えば、listは、copy.copy()と同じコピーを行うことができます。
sliceでコピーをする方法
a = [1, 2, 3]
b = a[:]
print("変化前")
print("a = ", a)
print("b = ", b)
print("")
a.append(4)
print("変化後")
print("a = ", a)
print("b = ", b)
# 実行結果
変化前
a = [1, 2, 3]
b = [1, 2, 3]
変化後
a = [1, 2, 3, 4]
b = [1, 2, 3]
このようにリストbは、リストaの値の更新の影響を受けないことが分かります。
注意
2次元配列やオブジェクトは、参照している変数の中にさらに参照している変数があるため、copy.deepcopy()でコピーをしないといけない。
# 以下のような場合は、deepcopy()でコピーします。
# 2次元配列 listの中にlist
array = [[1, 2], [34, 56]]
# オブジェクト
class Human:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
niwakoma = Human("Niwakoma", 21, "M") # オブジェクト
スポンサードサーチ
まとめ
今回は、pythonのcopyについて紹介しました。
どんなデータでもコピーできるのは「copy.deepcopy()」です。
intやstrなどは、変数の代入でコピーすることができます。
listやdictは、「copy.copy()」を使うことでコピーすることできます。
2次元配列は、「copy.deepcopy()」を使わなければ、コピーをすることができません。
また、listは「slice」を使うことでコピーをすることができます。
最後までお読み頂きありがとうございます。
スポンサードサーチ