【Python学習帳】017_コピーの深みにはまる
初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf
をCC-BY-NC-NDライセンスに従って引用します。
第4章の勉強中です。
今回は上記教材を離れて寄り道し、コピーにまつわるいろいろな情報に触れてみます。
コピーには浅いコピーと深いコピーがあるということは学びました。
教材では深いコピーについては紹介だけで、体験しなかったので不思議でした。
不思議に思ったのは、いつもはとても丁寧に私たちに実行しながら学ぶ機会をくれる構成だからです。おそらくなのですが第8章まで進んで初めて習う「モジュール」を使わないとできないので敢えて割愛したんだと推察しています。
IDLEでも標準モジュールcopyをimportすればdeepcopyを体験できました。
前の回はb = a.copy()で浅いコピーでbを作りましたが、今回は深いコピーでdcを作ってみています。
その後に[0][0]の要素を0に変えた時に挙動が異なるので、前回の結果と見比べていただけたらと思います。
dc[0][0]を変えてもa[0][0]が変わらないのはそもそも別のidだった、つまり「データの所在」が違っていたからです。
今回もPython Tutorで可視化してみました。
dc = copy.deepcopy(a)
浅いコピーも以下に示します。
b = a.copy()
可視化ってやっぱりわかりやすい!
となんかわかった気になって一度は喜んだのですが、下記の記事に触れて「あれ、またわからなくなってきた」と思いました。
「変数の初期化」は全てを超越する
しかもリストのコピーの基本がわかったとしても、まだ習ってないけど
とか見てしまうと、上記で「わかりやすい」と言ってしまうことの浅はかさが怖くなります。
きっと近い将来使ってみることになるNumPyやPandasではcopy以外にviewもありますね。
NumPy配列ndarrayと同様にpandas.DataFrameにもビュー(view)とコピー(copy)がある。
locやilocでpandas.DataFrameの一部を選択するなどして新たなpandas.DataFrameを生成する場合、元のオブジェクトとメモリを共有する(元のオブジェクトのメモリの一部または全部を参照する)オブジェクトをビュー、元のオブジェクトと別にメモリを新たに確保するオブジェクトをコピーという。
好奇心でdeepcopyを体験して学びを深めようとして迷い込みそうになってきたので次回は寄り道から引き返して教材の続きを勉強します。