我有以下代码

visited = [[false]*4] * 3

它向我展示了2-D数组

[[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

但现在当我判断2-D数组时,我得到以下输出:

puts visited.inspect
> [[false, false, 1, false], [false, false, 1, false], [false, false, 1, false]]

我似乎不明白为什么同一列索引中的所有行都由1填充?

Edit: 我try 通过手动输入所有元素(不乘以数组)来初始化我的数组visited,它工作得很好.我想知道为什么会是这样?抱歉,如果这不是这样做的适当约定,我来自于Python背景.

推荐答案

您有三个对same数组的引用.其中一个的变化就是全部三个的变化,因为实际上根本没有三个.

这可以通过使用#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]]

Ruby相关问答推荐

如何在 Ruby 中反转数字的字节顺序

用函数组合枚举器的Ruby方法

如何使用 gsub 删除返回字符串中的/和/i?

查看 Savon 请求 XML 而不发送到服务器

将块传递给方法传递给Ruby中的另一个方法

如何通过 Rack 提供静态文件?

在 Go (golang) 中编写一个 Ruby 扩展

ruby中字符的整数值?

带有索引的 Ruby `each_with_object`

Ruby 对象打印为指针

我可以在 Ruby 中使用默认值创建一个数组吗?

ruby datetime 中有 add_days 吗?

从字符串中删除所有特殊字符 - ruby

如何在 Ruby 中创建可重用的块/proc/lambda?

RSpec allow/expec vs expect/and_return

获取类中声明的所有实例变量

如何在 Mac OS X Lion 中安装 Ruby 1.9.3?

在命名包含多个单词的Ruby 时,是否应该使用破折号或下划线?

使用哈希值呈现 ERB 模板

Ruby 中的Monkey Patching到底是什么意思?