List 何时更改lua表值?
三个循环但结果不同,为什么?(在lua 5.1中) 1.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
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中的所有元素中,但2和3没有任何变化为什么?
- 我使用chunkspy查看这三个块的op代码,发现在第一个块中,它在改变表a中的值后具有可设置的op,但块2或3没有。块2和3只做添加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接受解决问题的答案是一个很好的做法。