Mirando el desmontaje (los códigos de bytes) es obvio por qué 0 < 0 == 0
es False
.
Aquí hay un análisis de esta expresión:
>>>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
Observe las líneas 0-8: estas líneas verifican si 0 < 0
obviamente regresa False
a la pila de Python.
Ahora observe la línea 11: JUMP_IF_FALSE_OR_POP 23
Esto significa que si 0 < 0
regresa, False
realice un salto a la línea 23.
Ahora, 0 < 0
es False
, entonces se realiza el salto, que deja la pila con un False
valor de retorno para toda la expresión 0 < 0 == 0
, aunque la == 0
parte ni siquiera esté marcada.
Entonces, para concluir, la respuesta es como se dijo en otras respuestas a esta pregunta.
0 < 0 == 0
Tiene un significado especial. El compilador evalúa esto en dos términos: 0 < 0
y 0 == 0
. Como con cualquier expresión booleana compleja and
entre ellas, si la primera falla, la segunda ni siquiera está marcada.
Espero que esto aclare un poco las cosas, y realmente espero que el método que utilicé para analizar este comportamiento inesperado anime a otros a intentar lo mismo en el futuro.
>>> (0) < (0 == 0)
, claramente no lo es.n = 0 < self.maxsize == self._qsize()
en primer lugar, en ningún idioma. Si sus ojos tienen que moverse de un lado a otro de la línea varias veces para descubrir lo que está sucediendo, no es una línea bien escrita. Simplemente divídalo en varias líneas.