如果我创建这个数组:
a = Array.new(3,Array.new(2,0))
它创建:
=> [[0, 0], [0, 0], [0, 0]]
当我尝试更改特定元素时:
a[0][0] = 3
它改变了多个值:
=> [[3, 0], [3, 0], [3, 0]]
为什么会这样?我怎样才能更改特定元素?
答案 0 :(得分:6)
您必须更改将阵列(this is a known issue)初始化为此的方式:
a = Array.new(3) { Array.new(2,0) }
您的版本与此版本之间的区别在于Array.new(2,0)
仅出现一次。你正在用3"指针创建一个数组"到第二个数组。您可以在以下代码中看到此内容:
a = Array.new(3,Array.new(2,0))
a.map { |a| a.object_id }
#=> [70246027840960, 70246027840960, 70246027840960] # Same object ids!
a = Array.new(3) { Array.new(2,0) }
a.map { |a| a.object_id }
#=> [70246028007600, 70246028007580, 70246028007560] # Different object ids
答案 1 :(得分:4)
您可能需要参考this
Array.new(3,Array.new(2,0))
可以分两步理解 -
创建了一个新数组Array.new(2,0)
再次创建一个新数组,其中3个元素在所有3个位置具有相同的对象(1)。
因此,更改任何子数组中的值会更改其中每个子数组的值。子数组指的是同一个对象。
正如Gavin Miller指出的那样,您需要使用a = Array.new(3) { Array.new(2,0) }
来更改每个元素。