Dictionary Infinite Loop 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 have outputted 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 ran it on Python 3.6, it outputted:

0 1 2 3 4 

Yes, it somehow stopped after 5 iterations. Clearly, there is no base condtion or sentinal 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.


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