Pythonにおける while True
と while 1
の違いについて解説します。
Python 2.x と Python 3.x の違い
Python 2.x では、True
はキーワードではなく、組み込みのグローバル定数であり、bool
型で 1 に定義されています。そのため、インタプリタは True
の内容をロードする必要があります。他の言葉で言えば、True
は再割り当て可能です。
# Python 2.7
>>> True = 4
>>> True
4
一方、Python 3.x では、True
は実際にキーワードとなり、実際の定数となります。
# Python 3.1.2
>>> True = 4
File "<stdin>", line 1
バイトコードの違い
Python 2.7 では、while (True): pass
と while (1): pass
のバイトコードは異なります。以下にそのスクリプトを示します。
import dis
def while_one():
while 1: pass
def while_true():
while True: pass
print("while 1")
print("----------------------------")
dis.dis(while_one)
print("while True")
print("----------------------------")
dis.dis(while_true)
このスクリプトは以下の結果を生成します。
while 1
----------------------------
4 0 SETUP_LOOP 3 (to 6)
>> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
while True
----------------------------
8 0 SETUP_LOOP 12 (to 15)
>> 3 LOAD_GLOBAL 0 (True)
6 JUMP_IF_FALSE 4 (to 13)
9 POP_TOP
9 10 JUMP_ABSOLUTE 3
>> 13 POP_TOP
14 POP_BLOCK
>> 15 LOAD_CONST 0 (None)
18 RETURN_VALUE
while True
を使用すると、明らかに複雑になります。
まとめ
Python 2.x と Python 3.x では、while True
と while 1
の挙動が異なります。Python 2.x では True
は再割り当て可能なグローバル定数であり、Python 3.x では True
は実際の定数となります。また、Python 2.7 では while True
と while 1
のバイトコードが異なり、while True
の方がより複雑になります。