Comportamento estranho e inesperado (desaparecendo / alterando valores) ao usar o valor padrão do Hash, por exemplo Hash.new ([])

Considere este código:

h = Hash.new(0)  # New hash pairs will by default have 0 as values
h[1] += 1  #=> {1=>1}
h[2] += 2  #=> {2=>2}

Tudo bem, mas:

h = Hash.new([])  # Empty array as default value
h[1] <<= 1  #=> {1=>[1]}                  ← Ok
h[2] <<= 2  #=> {1=>[1,2], 2=>[1,2]}      ← Why did `1` change?
h[3] << 3   #=> {1=>[1,2,3], 2=>[1,2,3]}  ← Where is `3`?

Neste ponto, espero que o hash seja:

{1=>[1], 2=>[2], 3=>[3]}

mas está longe disso. O que está acontecendo e como posso obter o comportamento que espero?

questionAnswers(4)

yourAnswerToTheQuestion