En Python (verifiqué solo con Python 3.6, pero creo que también debería ser válido para muchas de las versiones anteriores):
(0, 0) == 0, 0 # results in a two element tuple: (False, 0)
0, 0 == (0, 0) # results in a two element tuple: (0, False)
(0, 0) == (0, 0) # results in a boolean True
Pero:
a = 0, 0
b = (0, 0)
a == b # results in a boolean True
¿Por qué el resultado difiere entre los dos enfoques? ¿El operador de igualdad maneja las tuplas de manera diferente?
fuente
,
une con menos fuerza que==
.Lo que ve en las 3 instancias es una consecuencia de la especificación gramatical del lenguaje y de cómo se analizan los tokens encontrados en el código fuente para generar el árbol de análisis.
Echar un vistazo a este código de bajo nivel debería ayudarlo a comprender lo que sucede debajo del capó. Podemos tomar estas declaraciones de Python, convertirlas en código de bytes y luego descompilarlas usando el
dis
módulo:Caso 1:
(0, 0) == 0, 0
(0, 0)
primero se compara con el0
primero y se evalúa comoFalse
. Luego se construye una tupla con este resultado y por último0
, por lo que se obtiene(False, 0)
.Caso 2:
0, 0 == (0, 0)
Una tupla se construye con
0
el primer elemento. Para el segundo elemento, se realiza la misma verificación que en el primer caso y se evalúa paraFalse
obtener(0, False)
.Caso 3:
(0, 0) == (0, 0)
Aquí, como puede ver, solo está comparando esas dos
(0, 0)
tuplas y regresandoTrue
.fuente
Otra forma de explicar el problema: probablemente esté familiarizado con los literales del diccionario.
y literales de matriz
y tuplas literales
pero lo que no se da cuenta es que, a diferencia de los literales de diccionario y de matriz, los paréntesis que normalmente ve alrededor de una tupla literal no son parte de la sintaxis literal . La sintaxis literal de las tuplas es solo una secuencia de expresiones separadas por comas:
(un "exprlist" en el lenguaje de la gramática formal de Python ).
Ahora, ¿qué esperas de la matriz literal
evaluar a? Eso probablemente se parece mucho más a que debería ser lo mismo que
que por supuesto se evalúa
[0, False]
. Del mismo modo, con un literal de tupla explícitamente entre paréntesisno es sorprendente conseguirlo
(0, False)
. Pero los paréntesis son opcionales;es lo mismo. Y es por eso que lo consigues
(0, False)
.Si se pregunta por qué los paréntesis alrededor de un literal de tupla son opcionales, es en gran parte porque sería molesto tener que escribir asignaciones de desestructuración de esa manera:
fuente
Agregar un par de paréntesis alrededor del orden en que se realizan las acciones puede ayudarlo a comprender mejor los resultados:
La coma se usa para separar expresiones (usando paréntesis podemos forzar comportamientos diferentes, por supuesto). Al ver los fragmentos que enumeró, la coma
,
los separará y definirá qué expresiones se evaluarán:La tupla
(0, 0)
también se puede desglosar de forma similar. La coma separa dos expresiones que comprenden los literales0
.fuente
En el primero, Python está haciendo una tupla de dos cosas:
(0, 0) == 0
, que se evalúa comoFalse
0
En el segundo es al revés.
fuente
mira este ejemplo:
entonces resultado:
luego, la comparación solo se aplica al primer número (0 y r) en el ejemplo.
fuente