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
相关产品推荐
相关产品推荐

