您不能在多个目标上使用扩充的赋值语句,不。
引用augmented assignment documentation:
除了在单个语句中分配给元组和多个目标之外,由扩充的赋值语句完成的赋值与正常赋值的处理方式相同。类似地,除了可能的 in-place 行为之外,通过扩充赋值执行的二元运算与正常的二元运算相同。
强调我的。
就地增强赋值从target -= expression 转换为target = target.__isub__(expression)(每个运算符都有相应的__i...__ 挂钩)并且不支持将该操作转换为多个目标。
在底层,增强赋值是二元运算符(+、*、- 等)的特化,不是赋值。因为实现是基于这些运算符,而二元运算符只有两个操作数,所以原始implementation proposal 中从未包含多个目标。
您必须单独应用分配:
x -= 1
y -= 2
或者,如果您真的非常想变得复杂,请使用operator 模块和zip() 将operator.isub 应用于组合(通过itertools.starmap(),然后使用元组赋值:
from operator import sub
from itertools import starmap
x, y = starmap(operator.isub, zip((x, y), (1, 2)))
isub 将确保调用正确的钩子,允许对支持它的可变类型进行就地减法。
或者,如果您正在操作不支持就地操作的类型,则使用生成器表达式就足够了:
x, y = (val - delta for val, delta in zip((x, y), (1, 2)))