我有以下代碼
visited = [[false]*4] * 3
這向我展示了二維陣列
[[false, false, false, false], [false, false, false, false], [false, false, false, false]]
現在我希望更改第 1 行第 2 列的元素,如圖所示:
[[false, false, false, false], [false, false, false, false], [false, false, false, false]]
^
所以我做了以下事情:
visited[1][2] = 1
但現在當我檢查二維陣列時,我得到以下輸出:
puts visited.inspect
> [[false, false, 1, false], [false, false, 1, false], [false, false, 1, false]]
我似乎無法弄清楚為什么同一列索引處的所有行都被填充為 1?
編輯:visited我嘗試通過手動輸入所有元素(不乘以陣列)來
初始化我的陣列,并且效果很好。我想知道為什么會這樣?抱歉,如果這不是這樣做的正確約定,我來自 Python 背景。
uj5u.com熱心網友回復:
您對同一個陣列有三個參考。一個的改變就是三個都改變,因為根本就沒有三個。
這可以通過使用#object_id.
irb(main):005:0> visited = [[false]*4] * 3
=> [[false, false, false, false], [false, false, false, false], [false, false, false, false]]
irb(main):006:0> visited.map(&:object_id)
=> [70221746802920, 70221746802920, 70221746802920]
現在考慮:
irb(main):008:0> visited = 3.times.map { [false] * 4 }
=> [[false, false, false, false], [false, false, false, false], [false, false, false, false]]
irb(main):009:0> visited.map(&:object_id)
=> [70221746635240, 70221746635200, 70221746635160]
所有三個陣列都有唯一的物件 ID。
irb(main):010:0> visited[0][2] = 42
=> 42
irb(main):011:0> visited
=> [[false, false, 42, false], [false, false, false, false], [false, false, false, false]]
uj5u.com熱心網友回復:
這是因為在 Ruby 中一切都是物件,而 Ruby 默認傳遞對該物件的參考。因此,您的 2D 陣列包含對相同的四個成員陣列的三個參考。你對一個人做什么,你對三個人都做什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/529718.html
標籤:红宝石
上一篇:如何在陣列中合并相同的哈希?
下一篇:Ruby3動態關鍵字引數
