Pythonにおけるリストのコピー

Python

はじめに

昔、Pythonのリストのコピーでつまずいた話になります。
同じミスがないように。。。と思い共有します。

環境

  • Python 3.6.3

リストのコピー

以下のようにリストを代入しただけだと

実行結果

l2だけを変更したつもりが、 l1まで変わってしまいました。
リストの場合、単純な代入だけでは同じオブジェクトを参照してしまいます。
C++を書いているときも似たようなことがあったので、コピーをしなければならないと思いました。
ということで、以下のようなコードで

実行結果

コピーをすることで別のオブジェクトになり、ちゃんと l2の値だけが変わりました。

多次元リストのコピー

多次元のリストでも同じように書いたのですが

実行結果

!?
l2だけを変えたつもりが、 l1まで変わってしまいました。

浅いコピーと深いコピー

Python(というかプログラミング全般)には浅いコピー copy深いコピー deepcopyがあるようです。
浅いコピーでは、オブジェクト内のオブジェクトまでコピーをしてくれません。
深いコピーでは再帰的にコピーを行うため、以下のようなコードにしたら

実行結果

ちゃんと l2の値だけが変わってくれました。

まとめ

単純にコピーと言っても、浅いコピー(シャローコピー)と深いコピー(ディープコピー)がありました。

Python