「我只改了 b,a 怎么变了?」——这是表引用问题的标准嚎叫。今天把钥匙和锁彻底讲清。
本课互动训练:专属动画 + 选择题测验。 打开 第 09 课 · 动画闯关,先看动画,再完成 3 道选择题。
配套动画实验室:堆 / 栈 / 引用 / # 号可点可演。 打开 Lua 表 · 堆栈内存动画实验室,对照本文点「播放当前演示」。local a = {1, 2, 3, 4}
local b = a
b[3] = 100
print(a[3]) --> 100
a、b 指向同一块内存。改 b 就是改 a。画图理解:
内存堆: [1, 2, 100, 4]
^ ^
| |
a b (两把钥匙,一扇门)
local x = 10
local y = x
y = 20
print(x) --> 10
数字、字符串赋值是值拷贝;表是引用。同一句 =,两种命运,类型决定的。
local function shallow_copy(t)
local r = {}
for k, v in pairs(t) do
r[k] = v
end
return r
end
local a = {1, 2, {9, 9}}
local b = shallow_copy(a)
b[1] = 100
print(a[1]) --> 1 (第一层互不影响)
b[3][1] = 5
print(a[3][1]) --> 5 (内层还是同一张表)
第一层复制了,里层仍共享。要完全独立,得递归深拷贝(后续进阶课讲)。
local function push(t, v)
t[#t + 1] = v
end
local bag = {}
push(bag, "木剑")
print(bag[1]) --> 木剑
函数里改表,外面的表跟着变。好处是省拷贝、快;坏处是不小心就污染调用方数据。
bag、bag_view、bag_copy,名字暴露意图print(a == b) 看是不是同一只表版本越大,表传得越远。今天这个引用没搞清,明天就是「全服装备被串号」。内存观不是装酷,是保命。
今日练习:写 b = a 改 b 观察 a;再写一个 shallow_copy,验证第一层独立、第二层仍共享。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
会判断了,就能做会回话的 NPC。今天拼一个简易 GM 工具界面。 一、用 say 吐出界面 客户端编辑器 Ctrl + F…
与或非听起来玄,其实就是三张通行证。 一、and(与)= 过安检 机票 + 身份证 ,少一样不让过。后面还能无限加条件。 二…
判断 = 比较 + 分支。今天把三种 if 写法、以及工程里最好用的「防卫语句」一次练透。 一、三种判断结构 elseif …
表会建、会取、会增删改查,最后一环是 遍历 。本篇先把坑标出来,下节课正式拆迭代器。 本课互动训练 :专属动画 + 选择题测…
「我只改了 b,a 怎么变了?」——这是表引用问题的标准嚎叫。今天把钥匙和锁彻底讲清。 本课互动训练 :专属动画 + 选择题…
理论够了,进游戏干一票:用一张表,存下角色的名、级、包、属性,并用它驱动「给我装备」。 本课互动训练 :专属动画 + 选择题…