Lua函数传递参数为内存地址而非值?是否为标准行为?
Lua传递参数是传地址而非传值?这是标准行为吗?
我发现Lua似乎会将参数的内存地址传递给函数,而非传递值,请问这是Lua的标准行为吗?以下是测试代码:
local t = { Give = {"original"}, Etapes = {}, } function check (obj) for k, v in pairs(obj) do if k == "Give" then obj[k] = {"modified"} end end -- return obj end print ("BEFORE t.Give[1]="..t.Give[1]) check(t) print ("AFTER t.Give[1]="..t.Give[1])
运行结果:
BEFORE t.Give[1]=original AFTER t.Give[1]=modified
这确实是Lua的标准行为,但准确来说,Lua的参数传递规则是按值传递,不过这里的“值”需要区分类型:
- 对于数字、字符串、布尔这类基础类型,传递的是值的副本,函数内修改不会影响外部;
- 对于表、函数、userdata这类引用类型,传递的是引用的副本(也就是你理解的内存地址的副本)。这个副本指向同一个对象,所以当你在函数内修改对象的成员(比如代码里修改
obj[k])时,操作的是原对象,外部自然能看到变化。
如果在函数里直接把obj赋值为新表(比如obj = {"new table"}),外部的t不会受到影响——因为这只是修改了函数内部局部变量obj的引用值,和外部的t没有关系。
内容的提问来源于stack exchange,提问作者Florian___
相关产品推荐
相关产品推荐

