裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

別名で参照(Python)

2020年12月19日 | Python

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])

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 最初から,重箱の隅をつつか... | トップ | 閏年判定関数 »
最新の画像もっと見る

コメントを投稿

Python」カテゴリの最新記事