Lua中Table引用赋值特性的原因、类型差异及优势咨询
为啥修改Table2会影响Table1?一文搞懂引用类型和值类型
先看你给出的代码示例:
Table1 = {"x"} Table2 = Table1
当你运行这段代码后:
Table2[1] = "y" -- 结果 Table1[1] 也变成了 "y",不再是原来的 "x"
一、出现这种现象的核心原因
这是因为在Lua里,表(table)是引用类型。你执行Table2 = Table1的时候,根本没有把Table1里的内容复制一份给Table2——相反,你只是把Table1指向的那个表在内存里的"地址"(也就是引用)传给了Table2。现在Table1和Table2就像同一个房间的两把钥匙,不管用哪把钥匙开门进去修改房间里的东西,另一个钥匙打开门看到的都是修改后的样子。
二、为啥字符串、整数不会有这情况?
字符串、整数这类属于值类型。当你把一个值类型变量赋值给另一个变量时,程序会直接把变量里的内容完整复制一份,新变量和原变量各拿各的副本,完全独立。举个例子:
local num1 = 10 local num2 = num1 num2 = 20 -- 此时 num1 还是10,num2是20,两者互不干扰
简单说,值类型的数据是直接存在变量里的,赋值就是复制数据本身;而引用类型的表是存在堆内存里的,变量里只存一个指向它的"指针",赋值时复制的是指针,不是数据。
三、这个特性有啥好处?
- 省内存:如果有多个地方需要用到同一个复杂的表(比如一个包含几百条配置的游戏道具表),不用复制好几份一模一样的数据,只需要传引用就行,内存占用直接减半甚至更多。
- 数据同步省心:比如做一个多人协作的工具,或者游戏里的玩家状态,多个模块都需要访问和修改同一组数据,用引用类型的话,只要改一次,所有关联的地方都会立刻看到变化,不用手动写同步逻辑。
- 性能更高:复制一个大表要花不少时间和内存,而传递引用只是复制一个小小的指针,速度快得不是一点半点,处理复杂数据时这个优势特别明显。
内容的提问来源于stack exchange,提问作者James Penner
相关产品推荐
相关产品推荐

