我有一个二维数组
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]]
我该如何避免这种情况?
答案 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.first
和bar
处的数组指向内存中的相同变量空间:
foo.first.object_id # => 70357558266700
bar.object_id # => 70357558266700
因为它们是相同的变量空间,所以更改bar
指向的数组,或更改foo.first
指向的数组,将更改另一个。
如果您了解正在发生的事情,这可能很有用,因为如果您有一个大数组并且想要暂时指向其中的深层嵌套元素,您可以指定一个变量来指向它而不是使用长数组访问器。
答案 3 :(得分:0)
因为那是您更改的阵列。没有办法避免这种情况。您无法在不更改阵列的情况下更改阵列。