Bị thu hút bởi câu hỏi này về các vòng lặp vô hạn trong perl: while (1) Vs. for (;;) Có sự khác biệt về tốc độ không? , Tôi quyết định chạy một phép so sánh tương tự trong python. Tôi mong đợi rằng trình biên dịch sẽ tạo ra cùng một mã byte cho while(True): passvà while(1): pass, nhưng đây thực sự không phải là trường hợp trong python2.7.
Tập lệnh sau:
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)
tạo ra các kết quả sau:
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
Sử dụng while Truephức tạp hơn đáng kể. Tại sao thế này?
Trong các ngữ cảnh khác, python hoạt động như thể Truebằng 1:
>>> True == 1
True
>>> True + True
2
Tại sao whilephân biệt hai?
Tôi nhận thấy rằng python3 không đánh giá các câu lệnh bằng cách sử dụng các hoạt động giống hệt nhau:
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
Có sự thay đổi nào trong python3 đối với cách đánh giá boolean không?