Comparaisons chaînées en Python : percer le mystère de 0 < 0 == 0 Mensonge
Dans les profondeurs du code de la bibliothèque standard de Python, se trouve une construction déroutante dans Queue.py de 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
Pourquoi cette expression, 0 &Lt ; 0 == 0, donne Faux ? À première vue, cela semble contre-intuitif, car 0 est clairement inférieur à 0 et 0 == 0 est vrai.
Comparaisons chaînées : le raccourci de Python
Python a un fonctionnalité unique appelée « comparaisons chaînées », qui rend l'expression des comparaisons de plage plus concise. Par exemple, ce qui suit équivaut à utiliser des comparaisons chaînées :
0 < x <= 5
En interne, ces comparaisons chaînées sont interprétées différemment. Python évalue l'expression de gauche à droite et renvoie la valeur de la première comparaison qui donne la valeur False. Dans notre cas, 0 < 0 est évalué à False, donc l'évaluation suivante == 0 n'est pas pertinente et donc l'expression renvoie False.
En revanche, lorsque des parenthèses sont introduites, elles forcent l'évaluation de l'expression qu'elles contiennent à être terminée avant la prochaine la comparaison est appliquée. Cela annule le comportement de comparaison en chaîne. En conséquence, nous obtenons les valeurs True attendues lorsque des parenthèses sont ajoutées :
(0 < 0) == 0 0 < (0 == 0)
Par conséquent, l'expression de la méthode full(), 0 < self.maxsize == self._qsize(), est évalué à False si self.maxsize est 0, indiquant que la file d'attente n'est jamais pleine lorsque la limite de taille est définie sur 0.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!