Nested loops let one iteration pattern run inside another.

nested loops The inner loop completes for each outer loop value before the outer loop advances.

Nested Iteration

innerLimit
nested_iteration.lua
Replay: real traced execution (multi-file project)
local innerLimit = 2
local visits = 0
local lastLabel = ""

for outer = 1, 2 do
  for inner = 1, innerLimit do
    visits = visits + 1
    lastLabel = outer .. ":" .. inner
  end
end

print("innerLimit=" .. innerLimit)
print("visits=" .. visits)
print("lastLabel=" .. lastLabel)
local innerLimit = 1
local visits = 0
local lastLabel = ""

for outer = 1, 2 do
  for inner = 1, innerLimit do
    visits = visits + 1
    lastLabel = outer .. ":" .. inner
  end
end

print("innerLimit=" .. innerLimit)
print("visits=" .. visits)
print("lastLabel=" .. lastLabel)
local innerLimit = 3
local visits = 0
local lastLabel = ""

for outer = 1, 2 do
  for inner = 1, innerLimit do
    visits = visits + 1
    lastLabel = outer .. ":" .. inner
  end
end

print("innerLimit=" .. innerLimit)
print("visits=" .. visits)
print("lastLabel=" .. lastLabel)
  1. innerLimit ← 2, visits ← 0, lastLabel ← (empty)

    1local innerLimit→ 2 = 2 --@innerLimit=1, 32local visits→ 0 = 03local lastLabel→ (empty) = ""
  2. outer = 1, 2 do

    pass 1 of 2
    5for outer1 = 1, 2 do6  for inner = 1, innerLimit do7    visits = visits + 1
  3. visits ← 1, lastLabel ← 1:1

    pass 1 of 4
    5for outer = 1, 2 do6  for inner1 = 1, innerLimit2 do7    visits→ 1 = visits + 18    lastLabel→ 1:1 = outer1 .. ":" .. inner19  end
    All 4 passes — pass 1 is the card above
    passinneroutervisitslastLabel
    1110 11:1
    2211 21:2
    3122 32:1
    4223 42:2
  4. outer = 1, 2 do

    pass 2 of 2
    5for outer2 = 1, 2 do6  for inner = 1, innerLimit do7    visits = visits + 1
  5. print("innerLimit=" .. innerLimit)

    12print("innerLimit=" .. innerLimit2)13print("visits=" .. visits4)14print("lastLabel=" .. lastLabel2:2)
    outputinnerLimit=2
    visits=4
    lastLabel=2:2
  1. innerLimit ← 1, visits ← 0, lastLabel ← (empty)

    1local innerLimit→ 1 = 12local visits→ 0 = 03local lastLabel→ (empty) = ""
  2. outer = 1, 2 do

    pass 1 of 2
    5for outer1 = 1, 2 do6  for inner = 1, innerLimit do7    visits = visits + 1
  3. visits ← 1, lastLabel ← 1:1

    pass 1 of 2
    5for outer = 1, 2 do6  for inner1 = 1, innerLimit1 do7    visits→ 1 = visits + 18    lastLabel→ 1:1 = outer1 .. ":" .. inner19  end
  4. outer = 1, 2 do

    pass 2 of 2
    5for outer2 = 1, 2 do6  for inner = 1, innerLimit do7    visits = visits + 1
  5. visits ← 2, lastLabel ← 2:1

    pass 2 of 2
    5for outer = 1, 2 do6  for inner1 = 1, innerLimit1 do7    visits→ 2 = visits + 18    lastLabel→ 2:1 = outer2 .. ":" .. inner19  end
  6. print("innerLimit=" .. innerLimit)

    12print("innerLimit=" .. innerLimit1)13print("visits=" .. visits2)14print("lastLabel=" .. lastLabel2:1)
    outputinnerLimit=1
    visits=2
    lastLabel=2:1
  1. innerLimit ← 3, visits ← 0, lastLabel ← (empty)

    1local innerLimit→ 3 = 32local visits→ 0 = 03local lastLabel→ (empty) = ""
  2. outer = 1, 2 do

    pass 1 of 2
    5for outer1 = 1, 2 do6  for inner = 1, innerLimit do7    visits = visits + 1
  3. visits ← 1, lastLabel ← 1:1

    pass 1 of 6
    5for outer = 1, 2 do6  for inner1 = 1, innerLimit3 do7    visits→ 1 = visits + 18    lastLabel→ 1:1 = outer1 .. ":" .. inner19  end
    All 6 passes — pass 1 is the card above
    passinneroutervisitslastLabel
    1110 11:1
    2211 21:2
    3312 31:3
    4123 42:1
    5224 52:2
    6325 62:3
  4. outer = 1, 2 do

    pass 2 of 2
    5for outer2 = 1, 2 do6  for inner = 1, innerLimit do7    visits = visits + 1
  5. print("innerLimit=" .. innerLimit)

    12print("innerLimit=" .. innerLimit3)13print("visits=" .. visits6)14print("lastLabel=" .. lastLabel2:3)
    outputinnerLimit=3
    visits=6
    lastLabel=2:3