为什么向特定子数组添加元素会影响给定数组的所有子数组?

时间:2015-11-18 17:34:34

标签: arrays ruby

这是我的代码:

but = Array.new(2, []) # => [[], []]
but[1] << 1
but # => [[1], [1]]

如果我用这个创建一个数组:

but = [[], []]

那么问题就不会发生。但是,我需要包含在but中的子数组的数量不是一个稳定的变量,我知道Array.new,循环等的替代方案很麻烦。

为什么会这样?不会but[1] << 1只影响一个特定的子元素吗?

1 个答案:

答案 0 :(得分:1)

因为but中的第一个子数组和第二个子数组是相同的数组对象。影响第二个子阵列需要第一个子阵列也受到影响。

请注意,参数在传递给它们的方法之前进行评估。在Array.new(2, [])中,子数组[]被计算为单个数组对象,然后在新创建的数组中使用两次相同的数组对象。