配列の初期化と参照

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

全部書き換わってやがる