for循环计数器该定义为局部变量吗?

目前,我一直使用这种方式编写for循环

local i
for i = 1, 10 do
  --stuff
end

我认为为了更好的性能和减少错误风险,应该尽量使用local

但是,我发现通常使用以下方式

for i = 1, 10 do
  --stuff
end

使用local是否更优,或者省略它是否相当无害?

点赞
用户1127098
用户1127098

(编辑)你提供的代码示例没有区别。但是请注意,你使用 local i 定义的变量并不是在你的 for i = 1, 10 do 循环中使用的同一变量。当循环结束时,原始的 i 值保持不变(也就是说,i == nil)。

siffiejoe 指出,循环控制/计数变量从不可以在循环外部访问,即使预先定义了相同的变量名。循环内对变量的任何引用都将使用循环值。循环外的任何引用将使用原始或非循环值。

因此,在 for 语句中重复使用现有变量名称而不破坏原始变量是安全的。如果你想在循环后访问计数器变量,则可以首先定义一个额外的变量,并在循环内更新它,如以下代码(siffiejoe 的示例):

local j
for i = 1, 10 do
    j = i
    --[[ stuff ]]
end
print(j) -- j 存储循环结束前的最后一个 i 值

文档:数值型 for 循环

2016-03-29 17:22:02
用户1009479
用户1009479

简短回答:不要在 for 循环前添加 local i,因为这是无用的且容易混淆。


for 循环会开始一个新的块,在这个块中,控制变量(这里是 i)已经是本地变量了。添加 local i 类似于:

local i
do
    local i = 0
    -- do something
end

请注意,块内的 i 是一个全新的变量,它遮盖了外部的 i。当块结束时,外部的 i 又重新出现了,但是它对块内发生的事情一无所知,因为这两个变量除了名称相同以外没有任何关系。

2016-03-30 01:56:48
用户134758
用户134758

Lua 中的 for 循环控制结构有一些特别之处,它并不完全等同于 C 语言中的 for 循环。

其中一个特别之处就在于循环的索引变量是由循环控制的。索引变量本身是局部变量,在循环内部修改它实际上没有任何效果。例如:

for i = 1, 5 do
   io.write(("i: %d; "):format(i))
   i = i + 10 -- 这没有任何效果,因为 'for' 控制着索引变量。
end

结果:

i: 1; i: 2; i: 3; i: 4; i: 5;
2016-04-03 19:21:11