ทึ่งกับคำถามนี้เกี่ยวกับลูปที่ไม่มีที่สิ้นสุดใน perl: while (1) Vs. สำหรับ (;;) ความเร็วต่างกันไหม ฉันตัดสินใจที่จะทำการเปรียบเทียบที่คล้ายกันใน 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
ทำไมถึง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 วิธีการประเมินบูลีนหรือไม่?