为什么在更改变量时,分配给变量的数组元素会发生变化?

时间:2014-10-10 01:08:44

标签: ruby arrays

我有一个二维数组

test_array = [[4,3],[4,5],[6,7]]

我想将它的最后一个元素分配给变量

test = test_array.last #=> [6, 7]

我想改变它

test[0] += 1
test #=> [7, 7]

为什么数组的最后一个元素也发生了变化?

test_array #=> [[4, 3], [4, 5], [7, 7]]

我该如何避免这种情况?

4 个答案:

答案 0 :(得分:2)

变量test为数组test_array.last提供引用。如果您修改了test的值,则test_array.last的值也会被修改。

答案 1 :(得分:1)

您的多维数组(test_array)引用了最后一个元素,因此您对test所做的任何更改都会显示在test_array中。如果您不想要这种行为,请在修改之前复制最后一个元素:

test_array = [[4,3],[4,5],[6,7]]
test = test_array.last.dup
# => [6, 7]
test[0] += 1
test
# => [7, 7]
test_array
# => [[4, 3], [4, 5], [6, 7]]

答案 2 :(得分:1)

以下是如何查看发生的情况;这是我定期使用的一种技术,当我帮助调试其他人的代码并且需要对正在发生的事情进行调整时:

foo = [[1,2]]
bar = foo.first

bar包含对foo中子数组的指针AKA引用。这意味着foo.firstbar处的数组指向内存中的相同变量空间:

foo.first.object_id # => 70357558266700
bar.object_id # => 70357558266700

因为它们是相同的变量空间,所以更改bar指向的数组,或更改foo.first指向的数组,将更改另一个。

如果您了解正在发生的事情,这可能很有用,因为如果您有一个大数组并且想要暂时指向其中的深层嵌套元素,您可以指定一个变量来指向它而不是使用长数组访问器。

答案 3 :(得分:0)

因为那是您更改的阵列。没有办法避免这种情况。您无法在不更改阵列的情况下更改阵列。