Python 浅いコピーと深いコピー

  • 20
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

最近リストの浅いコピーと深いコピーについて調べることがあったのでメモ。
(参考:8.10. copy — 浅いコピーおよび深いコピー操作

通常、リストをコピーして片方のリストの値を変更すると、もう一つのリストも値が変わってしまう(浅いコピー)

>>> l = [1, 2, 3]
>>> l2 = l
>>> l
[1, 2, 3]
>>> l2
[1, 2, 3]
>>> l[2] = 4
>>> l
[1, 2, 4]
>>> l2
[1, 2, 4]

これを回避するには、deepcopy()関数を使用すればよいみたい(深いコピー)。

>>> l = [1, 2, 3]
>>> import copy
>>> l2 = copy.deepcopy(l)
>>> l
[1, 2, 3]
>>> l2
[1, 2, 3]
>>> l[2] = 4
>>> l
[1, 2, 4]
>>> l2
[1, 2, 3]

空リストを作る時もこれに注意しないと、勝手に値が入ってしまったりして困る。

>>> empty = [[]] * 5
>>> empty
[[], [], [], [], []]
>>> empty[0].append(1)
>>> empty
[[1], [1], [1], [1], [1]]

このような2次元の空リストを作りたいときは、リスト内包表記を使うといいみたい。

>>> empty = [[] for x in range(5)]
>>> empty
[[], [], [], [], []]
>>> empty[0].append(1)
>>> empty
[[1], [], [], [], []]