We said in Lists Are Heterogeneous that lists can contain any type of data. That means that they can contain other lists. A list whose items are lists is called a nested list. For example, the following nested list describes life expectancies in different countries:
| >>> life = [['Canada', 76.5], ['United States', 75.5], ['Mexico', 72.0]] |
Here is the memory model that results from execution of that assignment statement:
Notice that each item in the outer list is itself a list of two items. We use the standard indexing notation to access the items in the outer list:
| >>> life = [['Canada', 76.5], ['United States', 75.5], ['Mexico', 72.0]] |
| >>> life[0] |
| ['Canada', 76.5] |
| >>> life[1] |
| ['United States', 75.5] |
| >>> life[2] |
| ['Mexico', 72.0] |
Since each of these items is also a list, we can index it again, just as we can chain together method calls or nest function calls:
| >>> life = [['Canada', 76.5], ['United States', 75.5], ['Mexico', 72.0]] |
| >>> life[1] |
| ['United States', 75.5] |
| >>> life[1][0] |
| 'United States' |
| >>> life[1][1] |
| 75.5 |
We can also assign sublists to variables:
| >>> life = [['Canada', 76.5], ['United States', 75.5], ['Mexico', 72.0]] |
| >>> canada = life[0] |
| >>> canada |
| ['Canada', 76.5] |
| >>> canada[0] |
| 'Canada' |
| >>> canada[1] |
| 76.5 |
Assigning a sublist to a variable creates an alias for that sublist:
As before, any change we make through the sublist reference will be seen when we access the main list, and vice versa:
| >>> life = [['Canada', 76.5], ['United States', 75.5], ['Mexico', 72.0]] |
| >>> canada = life[0] |
| >>> canada[1] = 80.0 |
| >>> canada |
| ['Canada', 80.0] |
| >>> life |
| [['Canada', 80.0], ['United States', 75.5], ['Mexico', 72.0]] |