List 何时更改lua表值?

List 何时更改lua表值?,list,hash,lua,lua-table,List,Hash,Lua,Lua Table,三个循环但结果不同,为什么?(在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 local a = {5, 4} for k,v in ipairs(a) do v = v + 1 end 3. local a = {["b

三个循环但结果不同,为什么?(在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
local a = {5, 4}
for k,v in ipairs(a) do
   v = v + 1
end
3.

local a = {["b"]=5, ["bb"]=4}
for k,v in pairs(a) do
   v = v + 1
end
local a = {5, 4}
for k,v in ipairs(a) do
   v = v + 1
end
  • 1确实将1添加到表a中的所有元素中,但23没有任何变化为什么?
  • 我使用chunkspy查看这三个块的op代码,发现在第一个块中,它在改变表a中的值后具有可设置的op,但块23没有。块23只做添加5 5 261;1(表示将1添加到寄存器5,但不将值保存到表中),为什么会发生这种情况

    • 这里的问题是
      k,v
      对中的
      v
      是对值的引用,而不是键

      这意味着
      v=
      只修改局部变量
      v
      ,而不影响表本身。您可以改为执行
      a[k]=v+1
      ,它携带2和3的预期结果


      然而,在第一种情况下,
      v
      是对表的引用。在lua中,修改一个表或对该表的任何引用都是对该表的所有引用进行的。这个问题包含一些关于参考值与值的有用信息。

      因为
      v
      是循环中存在的一个简单局部变量。修改
      v
      本身不会修改表中的数据。thx!我明白了,pairs和ipair函数只是将ref返回到表值,对吗?是的,如答案中所述。同样,如果您想修改该表,
      k
      持有返回该值的键,因此
      a[k]=something
      将为您设置该值,尽管
      v
      不会更新。@jammyWolf接受解决问题的答案是一个很好的做法。