This is a common misunderstanding. In the first example, you create an array with two elements. Both of them are pointers to the same array . So, when you repeat your outer array, you add 2 elements to the inner array, which is then reflected in your output twice
Compare these:
> array = Array.new(5, []) => [[], [], [], [], []] # Note - 5 identical object IDs (memory locations) > array.map { |o| o.object_id } => [70228709214620, 70228709214620, 70228709214620, 70228709214620, 70228709214620] > array = Array.new(5) { [] } => [[], [], [], [], []] # Note - 5 different object IDs (memory locations) > array.map { |o| o.object_id } => [70228709185900, 70228709185880, 70228709185860, 70228709185840, 70228709185780]
source share