variables - Lua:为什么改变一个变量的值也会改变另一个变量的值?

标签 variables lua registering

我认为运行这段代码你会明白我的意思。我想将 5 个名字注册到一个寄存器()。我循环了 5 次,在每个循环中我都有一个变量 newPerson,它应该保存关于一个人的所有信息,然后添加到 people 寄存器中。在这个例子中,为了简单起见,只注册了人的名字。 问题是最后所有人都变成了同一个名字:“Petra”。我对此进行了一些尝试,但无法为这种行为找到合理的理由。帮助表示赞赏!

local people={}
local person={
    name="Johan",
    lastName="Seferidis",
    class="B"
}
local names={"Markus", "Eva", "Nikol", "Adam", "Petra"} --people to register


for i=1, 5 do --register 5 people
    local newPerson=person
    local name=names[i]
    for field=1, 3 do --for each field(name, lastname, class)
        if field==1 then newPerson["name"]=name end --register name
    end
    people[i]=newPerson
end

print("First person name: " ..people[1]["name"])
print("Second person name: "..people[2]["name"])
print("Third person name: " ..people[3]["name"])

最佳答案

这里最重要的是Lua“包含”一个表的变量实际上只包含对一个表的引用。复制包含表的变量只会将引用复制到该表,因此表示与本例中相同的表:

a={"x","y","z"}
b=a
b[2]="Q"
print(a[2]) -- returns Q and not y. Why is easily seen by doing:
print(a,b) -- returns table: 0xXXXXXX 0xXXXXXX indicating it's the same table

如果你真的想要表格的副本,你需要求助于 http://lua-users.org/wiki/CopyTable 之类的东西

关于variables - Lua:为什么改变一个变量的值也会改变另一个变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4501536/

相关文章:

C++ 如何在包含两个变量的结构中将不同数量的值存储到我的变量中?

java - 为每个传入请求重置 servlet 类的实例变量

lua - 迭代表的表

lua - 在 corona sdk 中设计一个无限滚动的背景

lua - 加载 Lua 文件并捕获任何语法错误

c# - 如何从 Unity 映射中删除(取消注册)已注册的实例?

android - 为什么没有 android.content.SyncAdapter 元数据注册同步适配器?

c - C 中的可变大小矩阵

bash - 如何更改 Bash 中二级变量的值?