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

