Python プログラミング メモ

shallow copy と deep copy を簡単に書く Python

様々な実装においてリストをコピーして使いたいケースが多々あると思います。

コピーする方法は何通りかありますが、最も簡単にコピーする方法を記載します。

・shallow copy

コピーは2種類、shallow copy(浅いコピー)と deep copy(深いコピー) があります。

データ自体をコピーするのではなくデータの参照場所を示したものをコピーしています。

実装例は以下

"""
浅いコピー(shallow copy)を作成
"""

l = [1, 2, 3, 4, 5]

shallow_copy = l

"""
そのまま出力
"""
print(f"l- {l}")
print(f"shallow_copy- {shallow_copy}")
"""
出力結果
l- [1, 2, 3, 4, 5]
shallow_copy- [1, 2, 3, 4, 5]
"""

"""
元になるlのインデックス0を10に更新
"""

l[0] = 10

print(f"l- {l}")
print(f"shallow_copy- {shallow_copy}")

"""
出力結果
l- [10, 2, 3, 4, 5]
shallow_copy- [10, 2, 3, 4, 5]
"""




元になっているリスト l を書き換えるとshallow_copy の要素も更新されています。

これは、l と shallow_copy のデータが同じ場所に格納されていて、別々のオブジェクトから同じ格納場所を参照しているという事を意味しています。

・deep copy

全く同じデータをもう1つコピーして、元になっている l のデータが格納されているところとは別の場所に格納します。

よって、元になっている リスト l の要素が更新されたとしても deep copy の要素は影響を受けません。

実装例は以下

"""
深いコピー(deep copy)を作成
"""

l = [1, 2, 3, 4, 5]

deep_copy = l[:]

"""
そのまま出力
"""
print(f"l- {l}")
print(f"shallow_copy- {deep_copy}")
"""
出力結果
l- [1, 2, 3, 4, 5]
deep_copy- [1, 2, 3, 4, 5]
"""

"""
元になるlのインデックス0を10に更新
"""

l[0] = 10

print(f"l- {l}")
print(f"deep_copy- {deep_copy}")

"""
出力結果
l- [10, 2, 3, 4, 5]
deep_copy- [1, 2, 3, 4, 5]
"""

リスト l の要素が更新されても deep_copy が影響を受ける事はありませんでした。

リストの最も簡単なコピーの実装例でした。

-Python, プログラミング, メモ

Copyright© donguri.pyのblog , 2024 All Rights Reserved.