具有扩充赋值的Python运算符优先级

Man*_*ngo 4 python operator-precedence augmented-assignment

看来这个问题只回答了Java,但我想知道它是如何在Python中运行的.这些都一样吗?

a += b / 2
Run Code Online (Sandbox Code Playgroud)

a += (b / 2)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

是的,那些是一样的.Python的扩充赋值不是表达式,它是一个语句,并且不在表达式优先级规则中起作用.+=不是运算符,而是扩展赋值语句语法的一部分.

因此,右侧的+=所有内容都是表达式,但+=本身并非如此,因此最终将始终处理赋值.

并且因为(扩充)赋值不是表达式,所以它也不能生成在周围表达式中使用的值.没有(a += b) / 2,这是一个语法错误,当然没有if (a += b / 2):或其他这样的恶作剧.

请参阅有关扩充赋值语句参考文档,其中指出语法为:

augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                           | ">>=" | "<<=" | "&=" | "^=" | "|="
Run Code Online (Sandbox Code Playgroud)

所以它augop是语句语法的一部分,只有下面的部分是一个表达式(具体来说,是一个expression_listyield_expression语法规则).

此外,解释显示:

增强赋值评估目标(与正常赋值语句不同,它不能是解包)和表达式列表,执行特定于两个操作数上的赋值类型的二进制运算,并将结果赋给原始目标.目标仅评估一次.

因此augtarget首先处理该部分,然后处理表达式列表(或yield表达式),然后增强赋值应用运算符并分配结果.

此外,表达式引用文档确实包含一个优先级表,但该表不包括赋值(扩充或其他),只是因为赋值不是表达式而是语句.