Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

293
Views
Orden de evaluación de las expresiones de asignación (operador morsa)

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?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!