变量赋值给表格

我正在尝试将一个变量赋值给一个表,如下所示:

b = {x = 3, y = 4}

a = b
-- 通过值重新赋值?
a.x = 10
print(b.x,b.y)
--输出:10 4

然而,我预期的是 b.x 一点都不会变,因为我只改变了 a.x 的值,所以似乎我不太明白这个例子中的 "a=b" 到底是在做什么。

如果这是一个基本问题,对此我感到抱歉,任何帮助都将不胜感激!

点赞
用户5868282
用户5868282

问题在于 a=b 会导致它们指向相同的表,正如下面 repl 的输出所示。

> c = {x = 10, y = 3}
> c
table: 0x564bbdb2d420
> b = c
> b
table: 0x564bbdb2d420
> c
table: 0x564bbdb2d420

你需要一个深度复制,例如这个(来自于这个gist):

function copy3(obj, seen)
  -- Handle non-tables and previously-seen tables.
  if type(obj) ~= 'table' then return obj end
  if seen and seen[obj] then return seen[obj] end

  -- New table; mark it as seen an copy recursively.
  local s = seen or {}
  local res = setmetatable({}, getmetatable(obj))
  s[obj] = res
  for k, v in pairs(obj) do res[copy3(k, s)] = copy3(v, s) end
  return res
end

使用方法如下 a = copy3(b)

2018-12-11 12:15:31