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

Lua中为何函数可通过参数修改表索引却无法修改传入变量?

Lua参数传递:为什么能修改表索引却改不了普通变量?

先看你给出的两段代码:

普通变量的情况

variable = 1
function f(v)
  v = 2
end
f(variable)
print(variable)
-- 输出 1

Lua里函数参数是按值传递的。当你把variable传入函数f时,参数v拿到的是variable的一个副本——也就是数值1。函数里给v赋值2,只是修改了这个副本的值,和外部的variable完全没关系,所以最后打印的还是原来的1。

表的情况

local my_table = {}
local index = 1
function f(t,i)
  t[i] = 2
end
f(my_table, index)
print(my_table[1])
-- 输出 2

同样是按值传递,但表的“值”是一个指向实际表对象的引用(可以理解成存储表的内存地址)。当你把my_table传给参数t时,t拿到的是这个引用的副本,意味着t和my_table指向的是同一个表对象。

函数里执行t[i] = 2,是通过这个引用找到对应的表,修改了表内部的元素——这相当于直接操作了原表,所以外部的my_table自然能看到这个变化。

如果反过来,你在函数里给t赋值一个新表:

function f(t)
  t = {3}
end
f(my_table)
print(my_table[1])
-- 输出还是2,不会变成3

这时候就是修改了参数t的引用副本,让它指向新表,和原my_table没关系了,所以原表不受影响。

总结

  • 数字、字符串、布尔这类基本类型,传递的是值的副本,修改参数不会改变原变量;
  • 表、函数这类复杂类型,传递的是引用的副本,通过参数修改对象内部的内容时,原对象会跟着变,但直接给参数赋值新对象,原变量不会受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:19:01