You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua 5.3中如何避免嵌套表插入后内存共享引发的联动修改

解决Lua嵌套表引用导致原表被修改的问题

你的推测完全正确:table.insert(t2, t1[1])只是把t1内部表的引用插入到t2中,两者指向同一块内存地址,所以修改t2[1]的同时会改动t1[1]。要避免这种情况,需要创建原内部表的独立副本,而非直接传递引用。

方法1:手动创建单层副本(适用于结构固定的简单表)

如果内部表结构单一且层级明确,直接手动复制所有键值对生成新表:

local t1 = {{key = 1}}
local t2 = {}
-- 手动复制内部表的键值,生成独立新表
local new_table = {key = t1[1].key}
table.insert(t2, new_table)
t2[1].key = t2[1].key + 1
print(t1[1].key, t2[1].key) -- 输出 1  2

方法2:通用深拷贝函数(适用于任意嵌套结构的表)

如果表的嵌套层次不确定或结构复杂,可实现递归深拷贝函数,复制所有层级的表结构:

local function deep_copy(obj)
    local copy = {}
    for k, v in pairs(obj) do
        if type(v) == "table" then
            copy[k] = deep_copy(v)
        else
            copy[k] = v
        end
    end
    return copy
end

local t1 = {{key = 1}}
local t2 = {}
-- 用深拷贝生成完全独立的副本
table.insert(t2, deep_copy(t1[1]))
t2[1].key = t2[1].key + 1
print(t1[1].key, t2[1].key) -- 输出 1  2

该函数会递归遍历表的每一个元素,若元素是表则继续复制,否则直接复制值,确保新表与原表完全独立,修改新表不会影响原表。


内容的提问来源于stack exchange,提问作者Plush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:29:53