Search code examples
pythondictionaryinfinite-loop

Dictionary infinite loop is exiting unexpectedly


I was experimenting with various ways of creating an infinite loop in Python (other than the usual while True), and came up with this idea:

x = {0: None}

for i in x:
    del x[i]
    x[i+1] = None  # Value doesn't matter, so I set it to None
    print(i)

On paper, I traced out the way this would infinitely loop:

  1. I loop through the key's value in the dictionary
  2. I delete that entry.
  3. The current counter position in the loop + 1 will be the new key with value None which updates the dictionary.
  4. I output the current counter.

This, in my head, should output the natural numbers in a sort of infinite loop fashion:

0
1
2
3
4
5
.
.
.

I thought this idea was clever, however when I run it on Python 3.6, it outputs:

0
1
2
3
4

Yes, it somehow stopped after 5 iterations. Clearly, there is no base condition or sentinel value in the code block of the loop, so why is Python only running this code 5 times?


Solution

  • There is no guarantee that you will iterate over all your dict entries if you mutate it in your loop. From the docs:

    Iterating views while adding or deleting entries in the dictionary may raise a RuntimeError or fail to iterate over all entries.

    You could create an "enumerated" infinite loop similar to your initial attempt using itertools.count(). For example:

    from itertools import count
    
    for i in count():
        print(i)
        # don't run this without some mechanism to break the loop, i.e.
        # if i == 10:
        #     break
    
    # OUTPUT
    # 0
    # 1
    # 2
    # ...and so on