是的,这些都是一样的。Python的增强分配 不是表达式
,它是语句,并且不在表达式优先级规则中发挥作用。
+=不是运算符,而是扩展的赋值语句语法的一部分。
因此 _,右侧的
+=_所有内容都是表达式,但
+=本身不是,因此赋值将始终在最后处理。
而且,由于(增强的)赋值不是表达式,因此它也不能产生用于周围表达式的值。没有
(a += b) / 2,这是语法错误,当然也没有
if (a += b /2):或其他类似的恶作剧。
请参阅有关
扩充赋值语句
的参考文档,该文档指出语法为:
augmented_assignment_stmt ::= augtarget augop (expression_list |yield_expression)
augtarget ::= identifier | attributeref | subscription
| slicing
augop ::= “+=” | “-=” | “=” | “@=” | “/=” | “//=”
| “%=” | “*=”
| “>>=” | “<<=” | “&=” | “^=” | “|=”
因此,这
augop是语句语法的一部分,只有后面的部分是表达式(具体来说是a
expression_list或
yield_expression语法规则)。
此外,说明显示:
扩充赋值评估目标(与普通赋值语句不同,不能解包)和表达式列表,对两个操作数执行特定于赋值类型的二进制运算,并将结果赋值给原始目标。该目标仅评估一次。
因此,
augtarget首先处理零件,然后处理表达式列表(或yield表达式),然后扩展的分配应用运算符并分配回结果。
此外,表达式参考文档的确包含一个优先级表,但是该表不包含赋值(增强的或其他形式的赋值),只是因为赋值不是表达式而是语句。



