tengo la siguiente expresión:
>>> a = 3 >>> b = 2 >>> a == (a := b) False Ahora, a == 2 después de la operación, como se esperaba. Y el resultado es lo que yo querría, es decir, la comparación de a a RHS de la asignación antes de la asignación.
Al invertir el orden del operador de igualdad, se invierte el resultado:
>>> a = 3 >>> b = 2 >>> (a := b) == a True No parece haber nada directamente relevante para este caso de esquina en PEP-572, sección de precedencia relativa . La siguiente sección, cambio al orden de evaluación, menciona que el orden de evaluación es de izquierda a derecha. ¿Es eso lo que está pasando aquí (guardar el valor de a , actualizarlo y compararlo con actualizar a , luego compararlo con su nuevo valor)?
¿Dónde se define este comportamiento y qué tan confiable es?
Ninguna de esas secciones del PEP tiene que ver con esto. Solo tiene una comparación == y se aplica el orden de evaluación general: "Python evalúa las expresiones de izquierda a derecha".
Entonces su (a := b) == a simplemente primero evalúa el lado izquierdo (a := b) , asignando algo a a y evaluando el mismo valor. Y luego evalúe el lado derecho a , que por supuesto sigue siendo el mismo valor (recién asignado), por lo que obtiene True .
Sobre esas secciones PEP:
Lo que dice la primera sección de PEP es que := agrupa menos estrechamente que == , por lo que se aplicaría si no tuviera paréntesis :
a == a := b significaría (a == a) := b (obtendría un error de sintaxis por intentar asignar a una comparación).a := b == a significaría a := (b == a) , donde con sus valores b == a se evalúa como False y eso se asigna a a y se convierte en el resultado de toda la expresión. (Tenga en cuenta que a nivel de declaración, tendría que escribir (a := b == a) . Lo que hace esa segunda sección de PEP es solo señalar algo malo que ya existía pero que := hizo "más visible", por lo que sugirieron arreglarlo finalmente. El problema era que una comprensión de dictados como {X: Y for ...} evaluó Y antes que X , en contra de la regla general de izquierda a derecha y en contra de visualizaciones de dictados como {X: Y} que ya evaluó X antes que Y como se esperaba . Considera esto:
>>> a, b = 3, 2 >>> {a: (a := b) for _ in '_'} {3: 2} Con ese comportamiento anterior, habría resultado en {2: 2} . Y dado que la gente podría escribir algo así cuando := estuvo disponible, se convirtió en un problema mayor.