为什么这样做
>> x, y = (1, 2)
>> print x, y
1 2
Run Code Online (Sandbox Code Playgroud)
但是增加会导致语法错误.
>> x, y -= (1, 2)
SyntaxError: illegal expression for augmented assignment
Run Code Online (Sandbox Code Playgroud)
有没有不同的方式,我期待:
>> x, y -= (1, 2)
>> print x, y
0 0
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 17
您不能在多个目标上使用扩充赋值语句,不能.
引用增强的任务文档:
除了在单个语句中分配元组和多个目标之外,由扩充赋值语句完成的赋值的处理方式与正常赋值相同.类似地,除了可能的就地行为之外,通过扩充分配执行的二进制操作与普通二进制操作相同.
强调我的.
就地扩充分配被转换target -= expression为target = target.__isub__(expression)(具有__i...__每个运算符的相应钩子)并且不支持将该操作转换为多个目标.
引擎盖下,增量赋值是二进制运算符的专业化(+,*,-等等),不的分配.因为实现基于那些运算符而二元运算符只有两个操作数,所以原始实现提议中从未包含多个目标.
您只需单独应用作业:
x -= 1
y -= 2
Run Code Online (Sandbox Code Playgroud)
或者,如果你真的,真的想要复杂,使用operator模块并zip()应用于operator.isub组合(通过itertools.starmap(),然后使用元组赋值:
from operator import sub
from itertools import starmap
x, y = starmap(operator.isub, zip((x, y), (1, 2)))
Run Code Online (Sandbox Code Playgroud)
其中isub将确保调用右钩子,允许对支持它的可变类型进行就地减法.
或者,如果您正在操作不支持就地操作的类型,则使用生成器表达式就足够了:
x, y = (val - delta for val, delta in zip((x, y), (1, 2)))
Run Code Online (Sandbox Code Playgroud)
这x, y = (1, 2)是序列分配。它依赖于右手边是一个可迭代对象,而左手边由与迭代左手边提供的相同数量的变量组成。
这x, y -= (1, 2)是尝试调用__isub__左侧操作数上的方法。就地(“增强”)赋值的本质是它必须在其左侧接受一个变量,该变量的值接收运算符调用,然后该变量接收该调用的结果。Python 不允许在多个目标上分配就地分配。