【问题标题】:Python augmenting multiple variables inlinePython内联增加多个变量
【发布时间】:2013-08-10 13:25:12
【问题描述】:

为什么会这样

>> 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

【问题讨论】:

  • 解决方案中未涵盖的内容,适用于偶然发现此问题的人:您可以使用 numpy 数组进行您想要的数学类型。

标签: python operators


【解决方案1】:

您不能在多个目标上使用扩充的赋值语句,不。

引用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)))

【讨论】:

    【解决方案2】:

    这个x, y = (1, 2) 是序列分配。它依赖于右侧是一个可迭代对象,而左侧由与左侧迭代提供的相同数量的变量组成。

    x, y -= (1, 2) 试图在左侧操作数上调用方法__isub__。就地(“增强”)赋值的本质是它必须在其左侧接受一个变量,其值接收运算符调用,然后变量接收该调用的结果。 Python 不允许在多个目标上分配就地分配。

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      相关资源
      最近更新 更多