1. ホーム
  2. python

[解決済み] while (1) vs. while(True) -- なぜ違いがあるのか(python 2 バイトコードで)?

2022-09-12 02:18:30

疑問点

perlの無限ループに関するこの質問に興味をそそられました。 while (1) Vs. for (;;) 速度の差はありますか? という質問に興味を持ち、Python で同様の比較を実行することにしました。私は、コンパイラが同じバイトコードを生成することを期待し while(True): passwhile(1): pass というような形で表示されますが、実はpython2.7ではそうではありません。

次のようなスクリプトです。

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)

  5     >>    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はあたかも True が 1 に等しいかのように振る舞います。

>>> True == 1
True

>>> True + True
2

なぜ while を区別しているのでしょうか?

python3は同じ操作でステートメントを評価することに気づきました。

while 1
----------------------------
  4           0 SETUP_LOOP               3 (to 6) 

  5     >>    3 JUMP_ABSOLUTE            3 
        >>    6 LOAD_CONST               0 (None) 
              9 RETURN_VALUE         
while True
----------------------------
  8           0 SETUP_LOOP               3 (to 6) 

  9     >>    3 JUMP_ABSOLUTE            3 
        >>    6 LOAD_CONST               0 (None) 
              9 RETURN_VALUE         

python3ではbooleanの評価方法に変更があるのでしょうか?

どのように解決するのですか?

Python 2.xの場合。 True はキーワードではなく、単に 組み込みグローバル定数 の中で 1 と定義されているものです。 bool 型では 1 に定義されています。したがって,インタプリタはまだ True . 言い換えれば True は再割り当て可能です。

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


Python 3.xでは は本当にキーワードになります。 になり、本当の定数になりました。

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

このように、インタープリタは while True: ループを無限ループに置き換えることができます。