Melihat pembongkaran (byte kode) itu jelas mengapa 0 < 0 == 0
adalah False
.
Berikut adalah analisis dari ungkapan ini:
>>>import dis
>>>def f():
... 0 < 0 == 0
>>>dis.dis(f)
2 0 LOAD_CONST 1 (0)
3 LOAD_CONST 1 (0)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 0 (<)
11 JUMP_IF_FALSE_OR_POP 23
14 LOAD_CONST 1 (0)
17 COMPARE_OP 2 (==)
20 JUMP_FORWARD 2 (to 25)
>> 23 ROT_TWO
24 POP_TOP
>> 25 POP_TOP
26 LOAD_CONST 0 (None)
29 RETURN_VALUE
Perhatikan baris 0-8: Baris-baris ini memeriksa apakah 0 < 0
yang jelas kembali False
ke tumpukan python.
Sekarang perhatikan baris 11: JUMP_IF_FALSE_OR_POP 23
Ini berarti bahwa jika 0 < 0
kembali False
melakukan lompatan ke baris 23.
Sekarang, 0 < 0
adalah False
, jadi lompatan diambil, yang meninggalkan tumpukan dengan False
yang merupakan nilai kembalian untuk seluruh ekspresi 0 < 0 == 0
, meskipun == 0
bagian tersebut bahkan tidak dicentang.
Jadi, untuk menyimpulkan, jawabannya seperti yang dikatakan dalam jawaban lain atas pertanyaan ini.
0 < 0 == 0
memiliki arti khusus. Kompilator mengevaluasi ini menjadi dua istilah: 0 < 0
dan 0 == 0
. Seperti halnya ekspresi boolean kompleks di and
antara mereka, jika yang pertama gagal maka yang kedua bahkan tidak dicentang.
Berharap ini mencerahkan segalanya, dan saya sangat berharap metode yang saya gunakan untuk menganalisis perilaku tak terduga ini akan mendorong orang lain untuk mencoba hal yang sama di masa depan.