while True or while 1

Steven D'Aprano steve+comp.lang.python at pearwood.info
Sun Jan 22 00:25:25 EST 2012


On Sun, 22 Jan 2012 09:13:23 +1100, Chris Angelico wrote:

> On Sun, Jan 22, 2012 at 8:13 AM, Erik Max Francis <max at alcyone.com>
> wrote:
>> Why this should concern anyone, I don't know; someone who's rebound
>> `True` or `False` to evaluate to something other than true and false,
>> respectively, is only doing so to be difficult (or very foolish).  One
>> of the principles of Python programming is that We're All Adults Here,
>> so this kind of defensive programming is really superfluous.  In other
>> words, yes, it's quite reasonable to assume that (even in Python 2)
>> `True` is bound to something which is, in fact, true.
> 
> Yes, but there's no special code in the compiler to handle True - it's
> just a name like any other. It finds a token that looks like a name, so
> it puts a name lookup into the bytecode.
> 
>> The real reason people still use the `while 1` construct, I would
>> imagine, is just inertia or habit, rather than a conscious, defensive
>> decision.  If it's the latter, it's a case of being _way_ too
>> defensive.
> 
> Ehh, 'while 1' is shorter too. I reckon some people are just lazy :) 


Or they've been writing Python code since before version 2.2 when True 
and False were introduced, and so they are used to the "while 1" idiom 
and never lost the habit.

In Python 2, "while 1" is a micro-optimization over "while True", because 
there is no need to look-up the name True. For extremely tight loops, 
that may make a difference.

In Python 3, there is no longer any real difference:


py> dis(compile('while 1: pass', '', 'exec'))
  1           0 SETUP_LOOP               3 (to 6)
        >>    3 JUMP_ABSOLUTE            3
        >>    6 LOAD_CONST               0 (None)
              9 RETURN_VALUE
py> dis(compile('while True: pass', '', 'exec'))
  1           0 SETUP_LOOP               3 (to 6)
        >>    3 JUMP_ABSOLUTE            3
        >>    6 LOAD_CONST               0 (None)
              9 RETURN_VALUE


Or perhaps they just like the look of "while 1".



-- 
Steven



More information about the Python-list mailing list