LoginSignup
6
8

More than 5 years have passed since last update.

配列を配列に追加するときに注意すること

Last updated at Posted at 2017-01-22

知らんかった...

JavaScript

const data_list = [];
let data = [];
data[0] = 0;
data[1] = 1;
data[2] = 2;
data_list.push(data);
console.log('data:', data); // [0, 1, 2]
console.log('data_list:', data_list); // [[0, 1, 2]]

// data = [];
data[0] = 3;
data[1] = 4;
data[2] = 5;
data_list.push(data);
console.log('data:', data); // [3, 4, 5]
console.log('data_list:', data_list); // [[3, 4, 5], [3, 4, 5]]

Python

data_list = []
data = [0, 0, 0]
data[0] = 0
data[1] = 1
data[2] = 2
data_list.append(data)
print ('data: ', data) # [0, 1, 2]
print ('data_list: ', data_list) # [[0, 1, 2]]

# data = [0, 0, 0]
data[0] = 3
data[1] = 4
data[2] = 5
data_list.append(data)
print ('data: ', data) # [3, 4, 5]
print ('data_list: ', data_list) # [[3, 4, 5], [3, 4, 5]]

よく考えれば当たり前のような気がしますが,1回目に追加された配列と2回目に追加された配列のアドレスが同じなので,参照される頃には同じ値となっているわけです.
期待する結果である [[0, 1, 2], [3, 4, 5]] を出力するには,適切なタイミングで配列を初期化する必要があります.

思考停止で配列の中身を上書きしてはいけません.
スクリプト言語を使っている場合でも,配列を扱う時ぐらいはメモリを意識するようにしましょう.

ちなみに私はこの方法で実験で集めるはずだったデータを闇に葬りました(泣)(アホ)

6
8
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8