Nested Loops

In previous posts, we covered while and for loops. Python let’s us nest loops. Let’s start with an example.

```grid = [
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[9, 8, 7, 6, 5, 4, 3, 2, 1],
]

for row in grid:
for cell in row:
print(str(cell))
print('\n', end=' ')
```

When run, we get the following output

```1 2 3 4 5 6 7 8 9

9 8 7 6 5 4 3 2 1
```

So why does this work? In our example, we have data structure that can be thought of in terms of an x,y grid. Basically, it’s a list that contains two lists: one list for each row.

When we begin our loop with `for row in grid:` we are starting a `for` loop with a variable named `row`. Everytime this loop updates, the row variable is assigned the next list object inside of the grid variable.

Now our next line of code is also a for loop: `for cell in row`. Remeber that row is a list object that corresponds to a row in the grid list. Each item inside of row is a number, so when this loop runs, the variable `cell` gets updated with a number inside of the list that is currently assigned to the row variable.

We can mix our loops also

```grid = [
[1, 2, 3, 4, 5, 6, 7, 8, 9],
[9, 8, 7, 6, 5, 4, 3, 2, 1],
]

for row in grid:
index = 0
while index < len(row):
print(str(row[index]))
index += 1
```

This code delivers the same output as the first example. The differnce is that this time, we have a while loop as our nested loop rather than a for loop. As you can see, this code is a little more complex than the first example, but the point of it was to demonstrate that it's possible to mix and match loops.

Also keep in mind that you can have loops that are infintely nested as long as your hardware can handle it. However, if you find that you are nesting loops deeper than two loops, then consider restructing your code since nesting loops that deep will impact the code's reability and make it difficult to debug.