copyする理由
前回画像処理のコードの中で各処理の途中でデータをコピーしていた理由*1についてです。
int型の時
ある変数v1を設定します。
printすると設定した値1が表示されます。
別の変数v2にv1を代入します。
printすると代入したv1の値1が表示されます。
その後v1の値を変更すると、v1の変更はv2に影響しません。
printするとv1は変更後の値3が、v2は変更する前に代入したv1の値1が表示され、int型の時はv2の値はv1の変更に影響しません。
ここまでは違和感は感じない話だと思います。
リスト型についても同じように実験してみます。
list型の時
v1にリスト型で値を設定します。
printすると設定した[1,1,1]が表示されます。
別の変数v2にv1を代入します。
printすると代入したv1の値[1,1,1]が表示されます。
その後、v1の先頭の要素を変更してみます。
v1,2をそれぞれ表示してみると、v1もv2も値が変更後のv1の値[2,1,1]に変わっています。
v2への代入後にv1を変更するとリスト型の場合、v2の値も変わってしまいます。
代入後に値を変更したのだから代入前のv2の値が変わるのは不自然に感じたのですが、pythonの変数はオブジェクトのため代入した変数が変わると、その変数が関わるそのほかの変数の値も更新されてしまいます。
copyで値が変わらないようにする
代入した値を変更したくない場合はcopyで値を固定します。
変数v1を設定して
v2にv1を代入する際にcopyします。
v1の先頭の値を変更し、v1,2を表示します。
v1は変更後の値[2,1,1]、v2は変更前の値[2,1,1]が表示されました。
画像のデータも同様のことが起きるので、値の更新が起きてほしくないタイミングでcopyしていました。