Dictionary infinite loop is exiting unexpectedly

  • A+

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?


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 


:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: