Python では,ベクトルや配列を別の変数に代入しても,新しいメモリが確保されるのではなくもとのメモリが参照される。これはときどきやっかいなバグのもとになるが,便利に使うこともできる。
>>> import scipy as sp
>>> a = sp.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
b, c に a の一部を代入する。
>>> b = a[:6]
>>> c = a[6:]
>>> b
array([0, 1, 2, 3, 4, 5])
>>> c
array([6, 7, 8, 9])
元の a を変化させると
>>> a *= 2
>>> a
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
b, c も変化する。b, c は別のメモリ上にあるのではなく,元の a の部分を指しているから当たり前。
>>> b
array([ 0, 2, 4, 6, 8, 10])
>>> c
array([12, 14, 16, 18])
b, c の要素を変化させると a も変わる
>>> c[2] = 200
>>> c
array([ 12, 14, 200, 18])
>>> a
array([ 0, 2, 4, 6, 8, 10, 12, 14, 200, 18])
しかし,以下のようにして c 全体を置き換えると,新たに c 用にメモリが確保されるようで,c は変わるが,a は不変だ。これも,使い方を間違えるとバグの元になるようだ。
>>> c = sp.repeat(20, 4)
>>> c
array([20, 20, 20, 20])
>>> a
array([ 0, 2, 4, 6, 8, 10, 12, 14, 200, 18])
※コメント投稿者のブログIDはブログ作成者のみに通知されます