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

我认为运行这段代码,你将会明白我的意思。我想要将5个名字注册到一个注册器(people)中。我循环5次,每次都有一个变量_newPerson_,它应该保存一个人的所有信息,然后添加到_people_注册器中。在这个例子中,为了简单起见,只注册了人的名字。 问题在于,最终所有的人都会变成相同的名字:"Petra"。我尝试过这个问题,但是无法得出合理的原因。非常感谢你的帮助!

local people={}
local person={
    name="Johan",
    lastName="Seferidis",
    class="B"
}
local names={"Markus", "Eva", "Nikol", "Adam", "Petra"} --要注册的人

for i=1, 5 do --注册5个人
    local newPerson=person
    local name=names[i]
    for field=1, 3 do --对于每个字段(名字、姓氏、班级)
        if field==1 then newPerson["name"]=name end --注册名字
    end
    people[i]=newPerson
end

print("第一个人的名字: " ..people[1]["name"])
print("第二个人的名字: "..people[2]["name"])
print("第三个人的名字: " ..people[3]["name"])

原文链接 https://stackoverflow.com/questions/4501536

点赞
stackoverflow用户107090
stackoverflow用户107090

尝试一下:

local people={}
local names={"Markus", "Eva", "Nikol", "Adam", "Petra"} -- 要注册的人员

for i=1, 5 do
    people[i]={
        name=names[i],
        lastName="Seferidis",
        class="B"
        }
end
2010-12-21 16:51:19
stackoverflow用户513763
stackoverflow用户513763

这里需要注意的是,Lua 中“包含”表格的变量实际上只包含对该表格的引用。复制包含表格的变量只会复制 _对该表格的引用_,因此在下面这个例子中,它们代表相同的表格:

a={"x","y","z"}
b=a
b[2]="Q"
print(a[2]) -- 返回 Q 而不是 y。为什么可以通过以下方式很容易地看到:
print(a,b) -- 返回 table: 0xXXXXXX 0xXXXXXX,表示它们是同一个表格

如果你真的想要表格的一个拷贝,你需要使用类似 http://lua-users.org/wiki/CopyTable 的方法。

2010-12-21 18:00:10
stackoverflow用户173806
stackoverflow用户173806

看起来你正在尝试将 person 当作 原型对象 使用。以下是对代码的更改,以添加 new 函数来方便对象的原型化。

object = {}
function object:new(o)
    -- 使用提供的表格,或者创建一个新表格
    o = o or {}
    -- 使用此对象作为原型
    setmetatable(o, self)
    self.__index = self
    return o
end

local people={}
local person=object:new({name="Johan",lastName="Seferidis",class="B"})

local names={"Markus", "Eva", "Nikol", "Adam", "Petra"} -- 要注册的人

for i=1, 5 do -- 注册 5 个人
    local newPerson=person:new({["name"]=names[i]})
    people[i]=newPerson
end

print("第一个人的名字: " ..people[1].name.." "..people[1].lastName.." "..people[1].class)
-->第一个人的名字: Markus Seferidis B

print("第二个人的名字: "..people[2].name.." "..people[2].lastName.." "..people[2].class)
-->第二个人的名字: Eva Seferidis B

print("第三个人的名字: " ..people[3].name.." "..people[3].lastName.." "..people[3].class)
-->第三个人的名字: Nikol Seferidis B
2010-12-21 19:00:48