Заінтригувало це питання про нескінченні петлі в 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помітно складніше. Чому це?
В інших контекстах пітон діє так, ніби 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 в тому, як оцінюються булеві?