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

Pit*_*kos 1 variables lua registering

我认为运行这段代码你会得到我的意思.我想在寄存器(人)中注册5个名字.我循环了5次,在每个循环中我有一个变量newPerson,它应该保存有关一个人的所有信息,然后被添加到人员注册表中.在此示例中,为简单起见,仅注册人员的姓名.问题是,最终所有人都变成了同名:"佩特拉".我对此有点玩,但无法得到这种行为的合理理由.帮助赞赏!

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"])
Run Code Online (Sandbox Code Playgroud)

jpj*_*obs 5

这里最重要的是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
Run Code Online (Sandbox Code Playgroud)

如果你真的想要一份表的副本,你需要求助于像http://lua-users.org/wiki/CopyTable这样的东西.