[Tutor] Generators

Michael Sparks ms at cerenity.org
Tue Jul 24 15:46:00 CEST 2007


On Tuesday 24 July 2007 13:11, Kent Johnson wrote:
> 'while 1' is optimized to just a jump - the compiler recognizes that the
> test is not needed and skips it. 'while True' requires looking up the
> value of the name 'True' and testing it.

This may seem counter intuitive, but the reason for this (for anyone puzzled) 
is because True is a name for the value representing boolean true, rather 
than a keyword for the value. If it were a keyword for the value, then 
like "1" it could not change in value. However since it isn't, it can.

For example, True can become false as the following demonstrates, so you do 
have to do those steps of looking up the value of the name "True" and test 
it:

Python 2.5 (r25:51908, Nov 27 2006, 19:14:46)
[GCC 4.1.2 20061115 (prerelease) (SUSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> True = 10
>>> while True:
...     print True
...     True = True -1
...
10
9
8
7
6
5
4
3
2
1
>>>

Rebinding True to anything else is a bad idea, but doable :-)

If you change True to "True" you get the same behaviour - python detects an 
immutable object in the condition and optimises it:
>>> dis.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

Regards,


Michael


More information about the Tutor mailing list