Learn as if you were to live forever

勉強の記録(画像処理,DeepLearning,ときどき英語)

copyする理由

前回画像処理のコードの中で各処理の途中でデータをコピーしていた理由*1についてです。

 

int型の時

ある変数v1を設定します。

v1=1
print(v1)

printすると設定した値1が表示されます。

別の変数v2にv1を代入します。

v2=v1
print(v2)

printすると代入したv1の値1が表示されます。

その後v1の値を変更すると、v1の変更はv2に影響しません。

v1=3
print(v1)
print(v2)

printするとv1は変更後の値3が、v2は変更する前に代入したv1の値1が表示され、int型の時はv2の値はv1の変更に影響しません。

ここまでは違和感は感じない話だと思います。

リスト型についても同じように実験してみます。

 

list型の時

v1にリスト型で値を設定します。

v1=[1,1,1]
print(v1)

printすると設定した[1,1,1]が表示されます。

別の変数v2にv1を代入します。

v2=v1
print(v2)

printすると代入したv1の値[1,1,1]が表示されます。

その後、v1の先頭の要素を変更してみます。

v1[0]=2
print(v1)
print(v2)

v1,2をそれぞれ表示してみると、v1もv2も値が変更後のv1の値[2,1,1]に変わっています。

v2への代入後にv1を変更するとリスト型の場合、v2の値も変わってしまいます。

代入後に値を変更したのだから代入前のv2の値が変わるのは不自然に感じたのですが、pythonの変数はオブジェクトのため代入した変数が変わると、その変数が関わるそのほかの変数の値も更新されてしまいます。

 

copyで値が変わらないようにする

代入した値を変更したくない場合はcopyで値を固定します。

変数v1を設定して

v1=[1,1,1]
print(v1)

v2にv1を代入する際にcopyします。

v2=v1.copy()
print(v2)

v1の先頭の値を変更し、v1,2を表示します。

v1[0]=2
print(v1)
print(v2)

v1は変更後の値[2,1,1]、v2は変更前の値[2,1,1]が表示されました。

 

画像のデータも同様のことが起きるので、値の更新が起きてほしくないタイミングでcopyしていました。