Arrays 在Ruby中,当我将数组X设置为等于数组Y并对数组X进行更改时,为什么还要对数组Y进行更改?
在此代码中:Arrays 在Ruby中,当我将数组X设置为等于数组Y并对数组X进行更改时,为什么还要对数组Y进行更改?,arrays,ruby,Arrays,Ruby,在此代码中: letters = %w{a b c d e f g} letters_2 = letters i = 0 while i < letters.length letters[i] = "X" puts "letters = " + letters.join puts "letters_2 = " + letters_2.join puts "======================" i+=1 end 字母=%w{a b c
letters = %w{a b c d e f g}
letters_2 = letters
i = 0
while i < letters.length
letters[i] = "X"
puts "letters = " + letters.join
puts "letters_2 = " + letters_2.join
puts "======================"
i+=1
end
字母=%w{a b c d e f g}
字母2=字母
i=0
而我只知道字母的长度
字母[i]=“X”
放置“字母=”+字母。连接
将“字母2=”+字母2.连接
放入“==================================”
i+=1
结束
当代码仅显式修改字母数组时,为什么字母2数组会发生更改?您只定义了一个数组
字母
然后将字母
分配给字母2
。因此,您可以创建与字母
相同的数组字母
。因此对字母
所做的任何更改都将影响字母2
两个数组引用相同的对象\u id
您可以检查letters.object\u id
是否与letters\u 2.object\u id
两个数组引用相同的内存地址
2.2.3 :038 > letters = %w{a b c d e f g}
=> ["a", "b", "c", "d", "e", "f", "g"]
2.2.3 :039 > letters_2 = letters
=> ["a", "b", "c", "d", "e", "f", "g"]
2.2.3 :040 > letters_2
=> ["a", "b", "c", "d", "e", "f", "g"]
2.2.3 :041 > letters
=> ["a", "b", "c", "d", "e", "f", "g"]
只能定义一个数组
字母
然后将字母
分配给字母2
。因此,您可以创建与字母
相同的数组字母
。因此对字母
所做的任何更改都将影响字母2
两个数组引用相同的对象\u id
您可以检查letters.object\u id
是否与letters\u 2.object\u id
两个数组引用相同的内存地址
2.2.3 :038 > letters = %w{a b c d e f g}
=> ["a", "b", "c", "d", "e", "f", "g"]
2.2.3 :039 > letters_2 = letters
=> ["a", "b", "c", "d", "e", "f", "g"]
2.2.3 :040 > letters_2
=> ["a", "b", "c", "d", "e", "f", "g"]
2.2.3 :041 > letters
=> ["a", "b", "c", "d", "e", "f", "g"]
在您的示例中,只有一个数组,
letters
和letters_2
都分配给它
听起来你想要的是letters\u2
是一个单独的数组,它是从letters
数组初始化的,但之后是独立的?如果是,那么一种方法是使用:
在您的示例中,只有一个数组,
letters
和letters_2
都分配给它
听起来你想要的是letters\u2
是一个单独的数组,它是从letters
数组初始化的,但之后是独立的?如果是,那么一种方法是使用:
您正在分配相同的引用 你可以在这里看到
letters = %w{a b c d e f g}
letters_2 = letters
puts letters.object_id #4579428
puts letters_2.object_id #4579428
因此,如果要将第二个数组作为单独的数组,则在将第一个数组分配给第二个数组时调用“dup”函数
letters = %w{a b c d e f g}
letters_2 = letters.dup
puts letters.object_id #18932832
puts letters_2.object_id #18932580
您正在分配相同的引用 你可以在这里看到
letters = %w{a b c d e f g}
letters_2 = letters
puts letters.object_id #4579428
puts letters_2.object_id #4579428
因此,如果要将第二个数组作为单独的数组,则在将第一个数组分配给第二个数组时调用“dup”函数
letters = %w{a b c d e f g}
letters_2 = letters.dup
puts letters.object_id #18932832
puts letters_2.object_id #18932580
@萨加潘迪亚82:的确如此。我将重新表述我的回答,以避免暗示只有一种方法可以做到这一点。@Sagarpandya2:的确如此。我将重新表述我的回答,以避免暗示只有一种方法可以做到这一点。这就是OP所描述的。问题是为什么更改会同时影响这两个数组?@Stefan两个数组都引用相同的内存地址。您在第一句中提到“仅一个数组”,随后又提到“两个数组”。这似乎是矛盾的,从你的解释中不清楚是否有一个或两个数组。@Stefan我已经编辑了我的答案。谢谢你的建议。这就是OP所描述的。问题是为什么更改会同时影响这两个数组?@Stefan两个数组都引用相同的内存地址。您在第一句中提到“仅一个数组”,随后又提到“两个数组”。这似乎是矛盾的,从你的解释中不清楚是否有一个或两个数组。@Stefan我已经编辑了我的答案。谢谢你的建议。另一种思考方式是
字母
和字母2
是同一个对象的不同名称。另一种思考方式是字母
和字母2
是同一个对象的不同名称。因为你已经用对象
证明了初始数组是相同的id,也许您可以包含后一个数组的对象id
s,以表明它们确实不同。@sagarpandya82好的,已更新。因为您已经使用对象id
显示了初始数组是相同的,也许您可以包含后一个数组的对象id
s,以表明它们确实不同。@sagarpandya82好的,已更新。