Perbandingan Berantai dalam Python: Membongkar Misteri 0 < 0 == 0 Falsehood
Dalam kedalaman kod perpustakaan standard Python, terdapat binaan yang membingungkan dalam Queue.py daripada Python 2.6:
def full(self): """Return True if the queue is full, False otherwise (not reliable!).""" self.mutex.acquire() n = 0 < self.maxsize == self._qsize() self.mutex.release() return n
Mengapa ungkapan ini, 0 < 0 == 0, hasilkan Salah? Pada pandangan pertama, nampaknya berlawanan dengan intuisi, kerana 0 jelas kurang daripada 0, dan 0 == 0 adalah Benar.
Perbandingan Berantai: Pintasan Python
Python mempunyai ciri unik yang dipanggil "perbandingan berantai," yang menjadikan perbandingan julat menyatakan lebih ringkas. Sebagai contoh, perkara berikut adalah bersamaan dengan menggunakan perbandingan berantai:
0 < x <= 5
Secara dalaman, perbandingan berantai ini ditafsirkan secara berbeza. Python menilai ungkapan dari kiri ke kanan dan mengembalikan nilai perbandingan pertama yang menilai kepada False. Dalam kes kami, 0 < 0 menilai kepada False, jadi penilaian == 0 yang berikutnya adalah tidak relevan dan dengan itu ungkapan mengembalikan False.
Sebaliknya, apabila kurungan diperkenalkan, mereka memaksa penilaian ungkapan di dalamnya untuk dilengkapkan sebelum yang seterusnya perbandingan digunakan. Ini menafikan tingkah laku perbandingan berantai. Hasilnya, kami mendapat nilai True yang dijangkakan apabila kurungan ditambahkan:
(0 < 0) == 0 0 < (0 == 0)
Oleh itu, ungkapan kaedah full(), 0 < self.maxsize == self._qsize(), menilai kepada False jika self.maxsize ialah 0, menunjukkan bahawa baris gilir tidak pernah penuh apabila had saiz ditetapkan kepada 0.
Atas ialah kandungan terperinci Mengapakah `0 < 0 == 0` Menilai kepada `False` dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!