为什么这样做
>> x, y = (1, 2)
>> print x, y
1 2
但是增加会导致语法错误..
>> x, y -= (1, 2)
SyntaxError: illegal expression for augmented assignment
有没有不同的方式,我期待:
>> x, y -= (1, 2)
>> print x, y
0 0
答案 0 :(得分:15)
您不能在多个目标上使用扩充赋值语句,编号
引用augmented assignment documentation:
除了在单个语句中分配元组和多个目标之外,由扩充赋值语句完成的赋值的处理方式与正常赋值相同。类似地,除了可能的就地行为之外,通过扩充赋值执行的二进制操作与普通二进制操作相同。
强调我的。
就地扩充分配从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)))
答案 1 :(得分:2)
此x, y = (1, 2)
是序列分配。它依赖于右侧是可迭代的对象,左侧由与左侧迭代相同数量的变量组成。
此x, y -= (1, 2)
尝试在左侧操作数上调用方法__isub__
。就地(“增强”)赋值的本质是它必须在其左侧采用变量,其值接收操作符调用,然后变量接收该调用的结果。 Python不允许在多个目标上分配就地分配。