配列の初期化と参照
p.47でK平均法をやっていて、2次元配列(配列の配列)が必要になった。
ループで空の配列を作っているが
bestmatches = [[] for i in range(4)]
Rubyだと、Array.newの引数で要素数と初期値を指定できる
>> arr = Array.new(3, 10) # 要素数3で初期値10の配列 => [10, 10, 10] >> arr[0] = 0 => 0 >> arr => [0, 10, 10]
が、http://www.ruby-lang.org/ja/man/html/trap_Array.html に書いてあるとおり
全部同じ実体へのポインタだった・・・・!!
=> 0 >> a = Array.new(5,Array.new) => [[], [], [], [], []] >> a[0].push(3) => [3] >> a => [[3], [3], [3], [3], [3]] >> b = Array.new(5, []) => [[], [], [], [], []] >> b[0].push(3) => [3] >> b => [[3], [3], [3], [3], [3]] >> b[2][3] = 23 => 23 >> b => [[3, nil, nil, 23], [3, nil, nil, 23], [3, nil, nil, 23], [3, nil, nil, 23], [3, nil, nil, 23]]
全部書き換わってやがる