在Lua中更改表中的值

在Lua中更改表中的值,lua,key,Lua,Key,我试图创建一个表,并希望更改该表中特定键的值。问题是当我换钥匙时,所有的钥匙都会变 function dump(o, nb) if nb == nil then nb = 0 end if type(o) == 'table' then local s = '' for i = 1, nb + 1, 1 do s = s .. " " end s = '{\n' for k,v in pair

我试图创建一个表,并希望更改该表中特定键的值。问题是当我换钥匙时,所有的钥匙都会变

function dump(o, nb)
  if nb == nil then
    nb = 0
  end
   if type(o) == 'table' then
      local s = ''
      for i = 1, nb + 1, 1 do
        s = s .. "    "
      end
      s = '{\n'
      for k,v in pairs(o) do
         if type(k) ~= 'number' then k = '"'..k..'"' end
          for i = 1, nb, 1 do
            s = s .. "    "
          end
         s = s .. '['..k..'] = ' .. dump(v, nb + 1) .. ',\n'
      end
      for i = 1, nb, 1 do
        s = s .. "    "
      end
      return s .. '}'
   else
      return tostring(o)
   end
end
Config={}
PlayersStatusTable={}
Config.DefaultStatus = {
    hunger = 1000000,
    thirst = 1000000,
}


local timeNow = os.clock()
PlayersStatusTable[12] = Config.DefaultStatus
PlayersStatusTable[112] = Config.DefaultStatus
PlayersStatusTable[54] = Config.DefaultStatus
for playerId, details in pairs(PlayersStatusTable) do
  print("playerid1",playerId)
  print(dump(PlayersStatusTable))
  print(dump(PlayersStatusTable[112]))
  print(dump(PlayersStatusTable[112].hunger))
  PlayersStatusTable[112].hunger = 5
end
输出如下:


playerid1   112
{
[112] = {
    ["thirst"] = 1000000,
    ["hunger"] = 1000000,
    },
[54] = {
    ["thirst"] = 1000000,
    ["hunger"] = 1000000,
    },
[12] = {
    ["thirst"] = 1000000,
    ["hunger"] = 1000000,
    },
}
{
["thirst"] = 1000000,
["hunger"] = 1000000,
}
1000000
playerid1   54
{
[112] = {
    ["thirst"] = 1000000,
    ["hunger"] = 5,
    },
[54] = {
    ["thirst"] = 1000000,
    ["hunger"] = 5,
    },
[12] = {
    ["thirst"] = 1000000,
    ["hunger"] = 5,
    },
}
{
["thirst"] = 1000000,
["hunger"] = 5,
}
5
playerid1   12
{
[112] = {
    ["thirst"] = 1000000,
    ["hunger"] = 5,
    },
[54] = {
    ["thirst"] = 1000000,
    ["hunger"] = 5,
    },
[12] = {
    ["thirst"] = 1000000,
    ["hunger"] = 5,
    },
}
{
["thirst"] = 1000000,
["hunger"] = 5,
}
5


我只希望id 112的饥饿度为5。

您将同一个表分配给所有3个键,因此它们都指向正在更改的同一个表。您需要确保在分配给每个键时创建一个新表

local function shallowCopy(t)
  local result = {}
  for k, v in pairs(t) do
    result[k] = v
  end
  return result
end

PlayersStatusTable[12] = shallowCopy(Config.DefaultStatus)

您将同一个表分配给所有3个键,因此它们都指向正在更改的同一个表。您需要确保在分配给每个键时创建一个新表

local function shallowCopy(t)
  local result = {}
  for k, v in pairs(t) do
    result[k] = v
  end
  return result
end

PlayersStatusTable[12] = shallowCopy(Config.DefaultStatus)

哦,好吧,现在我明白了,我想这和引用/值类型有关吧?我会试试你的解决方案哦,好吧,现在我明白了,我想这和引用/值类型有关吧?我会试试你的解决办法