perlの無限ループに関するこの質問に興味をそそられます:while(1)Vs。for(;;)速度に違いはありますか?、私はpythonで同様の比較を実行することを決めました。コンパイラーがwhile(True): passとに対して同じバイトコードを生成することを期待していましたwhile(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
なぜwhile2つを区別するのですか?
私は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でブール値の評価方法に変更はありますか?