python python-3.x

python - ¿Qué tiene de malo la comparación a, b== 1,2?



python-3.x (2)

Esta pregunta ya tiene una respuesta aquí:

Estaba escribiendo un código y en el código, a = 1 y b = 2 . Entonces, ¿por qué no es a,b == 1,2 verdadero? En cambio, Python muestra (1,False,1) . ¿Porqué es eso? Qué significa eso?

a = 1 b= 2 a,b == 1,2


Esencialmente, este comportamiento aparentemente extraño proviene del hecho de que el lado derecho de su expresión es una tupla, el lado izquierdo no lo es.

El resultado esperado se logra con esta línea, que compara una tupla con una tupla:

(a, b) == (1, 2)

Su expresión en cambio es equivalente a:

(a, b == 1, 2)

Que es una tupla que contiene a , la comparación entre b 1 , y 2 .

Puede ver el comportamiento diferente usando el módulo dis para verificar qué está haciendo python:

import dis dis.dis("a,b == 1,2") 1 0 LOAD_NAME 0 (a) 2 LOAD_NAME 1 (b) 4 LOAD_CONST 0 (1) 6 COMPARE_OP 2 (==) 8 LOAD_CONST 1 (2) 10 BUILD_TUPLE 3 12 RETURN_VALUE dis.dis("(a,b) == (1,2)") 1 0 LOAD_NAME 0 (a) 2 LOAD_NAME 1 (b) 4 BUILD_TUPLE 2 6 LOAD_CONST 0 ((1, 2)) 8 COMPARE_OP 2 (==) 10 RETURN_VALUE

Puede ver que en la primera evaluación, Python está cargando a , luego carga y b luego carga el elemento del lado derecho de la comparación ( 1 ) y compara los dos últimos elementos cargados, luego carga el segundo elemento derecho y luego construye una tupla con los resultados de esas operaciones y lo devuelve.

En cambio, en el segundo código, python carga el lado izquierdo (operaciones 0, 2 y 4), carga el lado derecho (operación 6), compárelos y devuelve el valor.


Necesita comparar explícitamente las dos tuplas usando paréntesis:

a = 1 b = 2 print((a,b) == (1,2)) # True

En este momento, está creando la tupla (a, b == 1, b) . Eso se evalúa en (1, False, 2) .