7.2.1. 增强赋值语句
增强赋值语句就是在单个语句中将二元运算和赋值语句合为一体:
- augmented_assignment_stmt ::=
augtarget
augop
(expression_list
|yield_expression
)- augtarget ::=
identifier
|attributeref
|subscription
|slicing
- augop ::= "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
- | ">>=" | "<<=" | "&=" | "^=" | "|="
(请参阅 原型 一节了解最后三种符号的句法定义。)
增强赋值语句将对目标和表达式列表求值(与普通赋值语句不同的是,前者不能为可迭代对象拆包),对两个操作数相应类型的赋值执行指定的二元运算,并将结果赋值给原始目标。 目标仅会被求值一次。
增强赋值语句例如 x += 1
可以改写为 x = x + 1
获得类似但并非完全等价的效果。 在增强赋值的版本中,x
仅会被求值一次。 而且,在可能的情况下,实际的运算是 原地 执行的,也就是说并不是创建一个新对象并将其赋值给目标,而是直接修改原对象。
不同于普通赋值,增强赋值会在对右手边求值 之前 对左手边求值。 例如,a[i] += f(x)
首先查找 a[i]
,然后对 f(x)
求值并执行加法操作,最后将结果写回到 a[i]
。
除了在单个语句中赋值给元组和多个目标的例外情况,增强赋值语句的赋值操作处理方式与普通赋值相同。 类似地,除了可能存在 原地 操作行为的例外情况,增强赋值语句执行的二元运算也与普通二元运算相同。
对于属性引用类目标,针对常规赋值的 关于类和实例属性的警告 也同样适用。