Lua表如何改变值?

Lua 5.1中为什么通过三种方法遍历表得到的结果不同?

1.

local a = {{b=5}, {b=4}}
for k,v in ipairs(a) do
   v.b = v.b + 1
end

2.

local a = {["b"]=5, ["bb"]=4}
for k,v in pairs(a) do
   v = v + 1
end

3.

local a = {5, 4}
for k,v in ipairs(a) do
   v = v + 1
end
  • 1 可以真正地将1添加到表a的所有元素中,但是 2&3 却没有改变任何值。为什么?
  • 我使用 chunkspy 查看这三个块的操作码,发现在第一个块中,在修改table a中的值后,它有settable操作,但块 23 却没有。块 2&3 只执行了 add 5 5 261;1(表示将1添加到寄存器5但不将值保存到table中),为什么会这样?
点赞
用户7170955
用户7170955

问题在于,在一个 k,v 对中,v 是对值的引用,而不是对键的引用。

这意味着,v= 只会修改本地变量 v,并不会影响表本身。相反,您可以使用 a[k] = v + 1,它可以实现 2 和 3 的预期结果。

然而,在第一个情况中,v 是一个对表的引用。在 Lua 中,修改表或任何对该表的引用都会对所有对该表的引用进行修改。这个问题中包含了一些关于引用与值的哪个比较好的信息。Here

2016-11-28 22:21:54