函数/变量作用域(按值传递还是引用传递?) [英] Function/variable scope (pass by value or reference?)
问题描述
我完全被 Lua 的变量作用域和函数参数传递(值或引用)搞糊涂了.
I'm completely confused by Lua's variable scoping and function argument passing (value or reference).
查看下面的代码:
local a = 9 -- since it's define local, should not have func scope
local t = {4,6} -- since it's define local, should not have func scope
function moda(a)
a = 10 -- creates a global var?
end
function modt(t)
t[1] = 7 -- create a global var?
t[2] = 8
end
moda(a)
modt(t)
print(a) -- print 9 (function does not modify the parent variable)
print(t[1]..t[2]) -- print 78 (some how modt is modifying the parent t var)
因此,这种行为完全让我感到困惑.
As such, this behavior completely confuses me.
这是否意味着表变量被传递给函数参考而不是价值?
Does this mean that table variables are passed to the function by reference and not value?
全局变量是如何创建的与已经定义的冲突局部变量?
How is the global variable creation conflicting with the already define local variable?
- 为什么
modt
能够修改表格但moda
无法修改a变量?
- Why is
modt
able to modify the table yetmoda
is not able to modify the a variable?
推荐答案
你猜对了,表变量是通过引用传递的.引用 Lua 5.1 参考手册:
You guessed right, table variables are passed by reference. Citing Lua 5.1 Reference Manual:
Lua 有八种基本类型:nil、boolean、number、string、function、userdata、thread 和 table.....
There are eight basic types in Lua: nil, boolean, number, string, function, userdata, thread, and table. ....
表、函数、线程和(完整的)用户数据值都是对象:变量实际上不包含这些值,只包含对它们的引用.赋值、参数传递和函数返回总是操纵对这些值的引用;这些操作并不意味着任何形式的复制.
Tables, functions, threads, and (full) userdata values are objects: variables do not actually contain these values, only references to them. Assignment, parameter passing, and function returns always manipulate references to such values; these operations do not imply any kind of copy.
所以 nil、布尔值、数字和字符串都是按值传递的.这完全解释了您观察到的行为.
So nil, booleans, numbers and strings are passed by value. This exactly explains the behavior you observe.
这篇关于函数/变量作用域(按值传递还是引用传递?)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!