Rはコピーするという話

ひとりアドベントカレンダー20日目。
Rからプログラミングの世界に入った人は他言語で似たようなライブラリを扱った時に混乱する可能性がある。
たとえば以下の挙動はRユーザにとってはなんら不自然なものではない。

> x1 <- 0:9
> x2 <- x1[seq(0,9,by=2)]
> x2[1] <- 12
> x2
[1] 12  3  5  7
> x1
 [1] 0 1 2 3 4 5 6 7 8 9

x2はx1の一部をとりだしたものであり、それを変更してもx1に変更がある、とは考えない。
しかし、Pythonのnumpyでは挙動が異なる。

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = a[::2]; b
array([0, 2, 4, 6, 8])
>>> b[0] = 12
>>> b
array([12,  2,  4,  6,  8])
>>> a 
array([12,  1,  2,  3,  4,  5,  6,  7,  8,  9])

http://turbare.net/transl/scipy-lecture-notes/intro/numpy/array_object.html#copies-and-views
つまり元のデータが変更される。
この辺知ってればなんてことない話だがRと同じ感じで触ると混乱する。

明日に続く。たぶん。