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()を使わなくてもコピーできるもの

intstr

他には、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()を使わないとコピーできないもの

listdict、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」を使うことでコピーをすることができます。

 

最後までお読み頂きありがとうございます。


スポンサードサーチ