使用python';s与未打包元组的就地加法

使用python';s与未打包元组的就地加法,python,Python,在解包元组时,python不能执行就地添加操作有什么原因吗?有没有简单的方法解决这个问题 例如 替代方案很难看,对于代码维护来说也不是很明显: >>> x, y = (5, 0) >>> x, y = map(sum, zip((x, y), (1, 8))) 不确定它是否适合Python元组的正常工作方式: >>> (1,2)+(3,4) (1, 2, 3, 4) 而不是(4,6) 为了方便语法,您还可以执行以下操作: class pa

在解包元组时,python不能执行就地添加操作有什么原因吗?有没有简单的方法解决这个问题

例如

替代方案很难看,对于代码维护来说也不是很明显:

>>> x, y = (5, 0)
>>> x, y = map(sum, zip((x, y), (1, 8)))

不确定它是否适合Python元组的正常工作方式:

>>> (1,2)+(3,4)
(1, 2, 3, 4)
而不是
(4,6)

为了方便语法,您还可以执行以下操作:

class pair(object):
    def __init__(self, *a):
        self.a = a
    def __add__(self, t):
        return map(sum, zip(self.a, t))

x, y = (5, 0)
x, y = pair(x, y) + (8, 1)
print x,y

元组是不可变的。您只能使用所需的值创建一个新元组。

您可以使用operator.add with
*
,这可能会使您添加每个子元素的意图更加明显:

from operator import add
x, y = map(add, *((x, y), (1, 8)))
还记录了:

增广分配\u stmt:=augtarget augop(表达式列表|收益率表达式)

augtarget::=标识符|属性ref |订阅|切片

augop::=“+=”|“-=”|“*=”|“/=”|“/=”|“%=”|“**=”
|“>>=”|“如果始终有两个部分,则可以使用复数文字来表示这对值(因此,
x
将是实部,
y
将是虚部):

显然,当您只执行一个操作时,这看起来有点复杂(!),但是如果您使用了大量成对值,它会很好地工作。但是,这被认为是一种黑客行为,会降低代码的可读性(人们可能想知道
.real
.imag
)到底在做什么)


一个更好的选择是构建自己的,以保存相关的值。例如:

>>> from collections import namedtuple
>>> class XY(namedtuple('XY', 'x y')):
    def __repr__(self):
        return 'XY({0.x!r}, {0.y!r})'.format(self)
    def __add__(self, other):
        return XY(self.x + other.x, self.y + other.y)


>>> xy = XY(5, 0)
>>> xy += XY(1, 8)
>>> xy
XY(6, 8)
这对于适应更大的数字组更具可读性和灵活性,而复数只能包含两个值。通过微调,
XY.\uuu add\uuu
也可以接受长度为2的任何iterable,因此,例如
XY+=(1,8)
也可以工作


关于您最初的尝试不起作用的原因,请注意(强调我的):

增强分配评估目标(,与正常分配不同 赋值语句,不能是解包的)和表达式 列表中,执行特定于赋值类型的二进制操作 并将结果赋给原始目标。 目标仅评估一次


元组代表什么?您可以构建一个类来保存相关值,或者,如果只有两个,则使用复数(其中,
.real
将是
x
。imag
将是
y
)我的朋友,另一种方法并不难看,这是python的方法。原因是元组是,这是列表之间的区别。为什么是向下投票?我想说的是,如果你允许解包时使用成对加法语法,
(1,2)+(3,4)
应该等于
(4,6)
为了保持一致性。你能对答案进行一点扩展吗?如果我将元组替换为lists@isedwards左侧始终是元组,如果要解包为多个名称,请不要在不处理复数时使用复数。@SimeonVisser有什么特殊原因吗?这是一个黑客攻击。如果你有两个值,你可以使用一个元组或一个新的数据类型,而不是复杂的数字,因为它们碰巧也有两个组件。@SimeonVisser我知道这是一个黑客攻击,我的意思更重要的是,是否有什么东西真的会被破坏。但我要补充一点。为什么不必要的元组创建和使用
*
?这相当于您的代码:
x,y=map(add,(x,y)、(1,8))
>>> x_y = 5 + 0j
>>> x_y += 1 + 8j
>>> x_y.real, x_y.imag
(6.0, 8.0)
>>> from collections import namedtuple
>>> class XY(namedtuple('XY', 'x y')):
    def __repr__(self):
        return 'XY({0.x!r}, {0.y!r})'.format(self)
    def __add__(self, other):
        return XY(self.x + other.x, self.y + other.y)


>>> xy = XY(5, 0)
>>> xy += XY(1, 8)
>>> xy
XY(6, 8)