Lua for循环减少我?奇怪的行为[重复]

Posted

技术标签:

【中文标题】Lua for循环减少我?奇怪的行为[重复]【英文标题】:Lua for loop reduce i? Weird behavior [duplicate] 【发布时间】:2015-06-28 21:53:28 【问题描述】:

谁能解释一下?

for i = 1, 5 do
  print(i)
  i = i - 1
  print(i)
end

输出是:

1
0
2
1
3
2
and so forth

我希望 i 在 1 和 0 之间变化。但显然它一直在增加,就好像我根本没有改变它一样。怎么回事?

我必须时不时地删除第 i 个表格元素。所以下一个要处理的元素将是 i 再次。在 C 语言中,我会在循环内容的末尾写上 --i 。 lua中的任何官方方式? :)

【问题讨论】:

不要使用循环控制变量。使用其他条件(即使是手动中断条件始终为真的条件)。 您还可以跟踪差异:local d=0; for/do i=i-d; if/then d=d+1 end ... end 【参考方案1】:

循环索引(在您的情况下为i)是循环体的局部变量,因此您对其进行的任何修改都不会影响循环条件或正在处理的下一个元素(对于@987654323 @循环)。

如果您需要更好地控制索引以删除元素并继续处理,您应该使用while 循环形式。有关详细信息,请参阅For Statement 部分。

【讨论】:

【参考方案2】:

改用while(true) 循环怎么样?然后你必须手动中断,但这可能有效。

local i = 5
while(true) do
    print(i)
    i = i - 1
    if (i == 0) then break; end
end

【讨论】:

【参考方案3】:

尝试设置循环控制变量会导致故障安全行为。

我在手册最新版本的语言不兼容部分找不到它,但我记得它在某处被列为更改。它更像是对先前未定义行为的形式化。

如果您真的很好奇,请查看luac 中的程序列表。循环控制变量有一个内部名称,因此不能更改。如果在赋值中使用相同的名称,则合成一个局部变量作为替代。它可以防止无意中导致for 变为无限。

你需要另一种循环。

【讨论】:

以上是关于Lua for循环减少我?奇怪的行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 for 循环期间密钥未存储在 lua 表中

减少我在 for 循环中递增的变量

减少计数值以重复循环循环不起作用。 python中的for循环有一个异常处理程序,它有一个continue语句

Lua 上的 For 循环

带有指针值的 Go 通道在 for 循环中的行为不符合预期[重复]

展开循环有效,for循环无效[重复]