python - ¿Qué tiene de malo la comparación a, b== 1,2?
python-3.x (2)
Esta pregunta ya tiene una respuesta aquí:
- ¿Por qué en Python 0, 0 == (0, 0) igual (0, falso) 6 respuestas
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)
.