The while loop in python runs until the "while" condition is satisfied. The "while true" loop in python runs without any conditions until the break statement executes inside the loop.
It distinguishes 1 and True in exactly the same way that the + example does. It's emitting a LOAD_GLOBAL (True) for each True , and there's nothing the optimizer can do with a global. So, while distinguishes 1 and True for the exact same reason that + does.
There is no practical difference. 1 and True are equal in python, and this is guaranteed in the future too, so could use whichever you like the look of best.
The while(1) or while(any non-zero value) is used for infinite loop. There is no condition for while. As 1 or any non-zero value is present, then the condition is always true. So what are present inside the loop that will be executed forever.
In Python 2.x, True
is not a keyword, but just a built-in global constant that is defined to 1 in the bool
type. Therefore the interpreter still has to load the contents of True
. In other words, True
is reassignable:
Python 2.7 (r27:82508, Jul 3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> True = 4
>>> True
4
In Python 3.x it truly becomes a keyword and a real constant:
Python 3.1.2 (r312:79147, Jul 19 2010, 21:03:37)
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> True = 4
File "<stdin>", line 1
SyntaxError: assignment to keyword
thus the interpreter can replace the while True:
loop with an infinite loop.
This isn't quite right,
thus the interpreter can replace the while True: loop with an infinite loop.
as one can still break out of the loop. But it is true that such a loop's else
clause would never be accessed in Python 3. And it is also true that simplifying the value lookup makes it run just as quickly as while 1
in Python 2.
Demonstrating the difference in time for a somewhat nontrivial while loop:
def while1():
x = 0
while 1:
x += 1
if x == 10:
break
def whileTrue():
x = 0
while True:
x += 1
if x == 10:
break
>>> import timeit
>>> min(timeit.repeat(while1))
0.49712109565734863
>>> min(timeit.repeat(whileTrue))
0.756627082824707
>>> import timeit
>>> min(timeit.repeat(while1))
0.6462970309949014
>>> min(timeit.repeat(whileTrue))
0.6450748789939098
To explain the difference, in Python 2:
>>> import keyword
>>> 'True' in keyword.kwlist
False
but in Python 3:
>>> import keyword
>>> 'True' in keyword.kwlist
True
>>> True = 'true?'
File "<stdin>", line 1
SyntaxError: can't assign to keyword
Since True
is a keyword in Python 3, the interpreter doesn't have to look up the value to see if someone replaced it with some other value. But since one can assign True
to another value, the interpreter has to look it up every time.
If you have a tight, long-running loop in Python 2, you probably should use while 1:
instead of while True:
.
Use while True:
if you have no condition for breaking out of your loop.
This is a 7-year-old question that already has a great answer, but a misconception in the question, which isn't addressed in any of the answers, makes it potentially confusing for some of the other questions marked as duplicates.
In other contexts, python acts as though True equals 1:
>>> True == 1
True
>>> True + True
2
Why does while distinguish the two?
In fact, while
isn't doing anything different here at all. It distinguishes 1
and True
in exactly the same way that the +
example does.
Here's 2.7:
>>> dis.dis('True == 1')
1 0 LOAD_GLOBAL 0 (True)
3 LOAD_CONST 1 (1)
6 COMPARE_OP 2 (==)
9 RETURN_VALUE
>>> dis.dis('True == 1')
1 0 LOAD_GLOBAL 0 (True)
3 LOAD_GLOBAL 0 (True)
6 BINARY_ADD
9 RETURN_VALUE
Now compare:
>>> dis.dis('1 + 1')
1 0 LOAD_CONST 1 (2)
3 RETURN_VALUE
It's emitting a LOAD_GLOBAL (True)
for each True
, and there's nothing the optimizer can do with a global. So, while
distinguishes 1
and True
for the exact same reason that +
does. (And ==
doesn't distinguish them because the optimizer doesn't optimize out comparisons.)
Now compare 3.6:
>>> dis.dis('True == 1')
1 0 LOAD_CONST 0 (True)
2 LOAD_CONST 1 (1)
4 COMPARE_OP 2 (==)
6 RETURN_VALUE
>>> dis.dis('True + True')
1 0 LOAD_CONST 1 (2)
2 RETURN_VALUE
Here, it's emitting a LOAD_CONST (True)
for the keyword, which the optimizer can take advantage of. So, True + 1
doesn't distinguish, for exactly the same reason while True
doesn't. (And ==
still doesn't distinguish them because the optimizer doesn't optimize out comparisons.)
Meanwhile, if the code isn't optimized out, the interpreter ends up treating True
and 1
exactly the same in all three of these cases. bool
is a subclass of int
, and inherits most of its methods from int
, and True
has an internal integer value of 1. So, whether you're doing a while
test (__bool__
in 3.x, __nonzero__
in 2.x), a comparison (__eq__
), or arithmetic (__add__
), you're calling the same method whether you use True
or 1
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With