如何通过值复制Lua表?

70

最近我写了一些类似以下的 Lua 代码:

local a = {}
for i = 1, n do
   local copy = a
   -- alter the values in the copy
end
显然,这不是我想要的,因为在Lua中变量保存的是匿名表的引用而不是表本身的值。这在《Lua编程》明确说明了,但我忘记了这一点。所以问题是,我应该写什么代码来获取a表中的值的副本,而不是像copy = a那样获取表的引用?
16个回答

1

1

只需使用

local unpack = unpack or table.unpack

list2 = {unpack (list)}

1
请将英文翻译成中文。只返回翻译的文本:请注意,如果列表超过8000个项目,此操作将失败。 - undefined

1

这就是你在基本表中能得到的最好的结果了。如果你需要复制带有元表的表,请使用类似deepcopy的东西。


1
在大多数情况下,当我需要复制一个表格时,我希望有一个与原始表格没有任何关联的副本,这样对原始表格的任何修改都不会影响副本(反之亦然)。
到目前为止展示的所有片段都无法为可能具有共享键或与表格具有键的表格创建副本,因为它们将继续指向原始表格。如果您尝试复制创建为:a = {}; a [a] = a 的表格,则很容易看出。Jon提到的deepcopy函数可以解决这个问题,因此如果需要创建真正/完整的副本,则应使用deepcopy

deepcopy 应该深入多少层?deepcopy({m = _G.mymodule}) 应该递归复制整个 mymodule 表还是仅复制对 mymodule 的引用,一旦它意识到可以从全局环境访问 mymodule - Egor Skriptunoff

0
这可能是最简单的方法:
local data = {DIN1 = "Input(z)", DIN2 = "Input(y)", AINA1 = "Input(x)"}

function table.copy(mytable)  --mytable = the table you need to copy

    newtable = {}

    for k,v in pairs(mytable) do
        newtable[k] = v
    end
    return newtable
end

new_table = table.copy(data)  --copys the table "data"

-3
在我的情况下,当表中的信息仅为数据和其他表(不包括函数等)时,以下代码行是否是最佳解决方案:
local copyOfTable = json.decode( json.encode( sourceTable ) )

我正在为Fibaro Home Center 2编写Lua代码,用于家庭自动化。由于Lua的实现非常有限,没有可以参考的中央函数库。因此,每个函数都需要在代码中声明,以保持代码可维护性,因此像这样的一行解决方案是可取的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接