【问题标题】:Not possible to do (a, b) += (1, 2) in python?不能在 python 中做 (a, b) += (1, 2) 吗?
【发布时间】:2009-12-09 05:32:10
【问题描述】:

以下行似乎不起作用:

(count, total) += self._GetNumberOfNonZeroActions((state[0] + x, state[1] - ring, state[2]))

我想在这种情况下不可能使用 += 运算符。我想知道为什么?

编辑:实际上我想要的是添加到变量计数并总计该函数返回的元组给出的值。现在想来,允许 (a, b) += (1, 2) 是没有意义的,因为它会创建一个新的元组,对吧?

换句话说,有没有办法简化这个?

    res = self._GetNumberOfNonZeroActions((state[0] + x, state[1] + ring, state[2]))
    count, total = res[0], res[1]

【问题讨论】:

  • 在阅读了您的 cmets 以回答答案之后,现在重新阅读您的问题,我对您的实际目标感到非常困惑。您的解释不包括循环,您是否循环不同状态并累积?或者你只是想要元组拆包?你的“换句话说”看起来你只是想要元组解包,这可以通过用=替换原始行中的+=来实现。用元组循环 += 将创建一个越来越长的元组。
  • 我想实现点加法之类的东西,这是(a, b) = (a, b) + (x, y) = (a+x, b+y)。
  • 那么你的问题和stackoverflow.com/questions/497885/python-tuple-operations基本一样,这里的stuple解决方案可能比依赖numpy省力。

标签: python


【解决方案1】:

您的观察是正确的:a += b 对于任何 a 和 b 的含义与 a = a + b 相同(除了它可能会保存对 a 的一次评估)。所以如果a 是一个元组,那么唯一可以+='d 的就是另一个元组;如果a 是一个临时的未命名元组,那么+= 当然是不可观察的——Python 通过将这种特殊情况作为语法错误捕获来帮助您。您需要在 += 之前给元组一个名称(或其他可重新分配的引用)...:

>>> thetup = (a, b)
>>> thetup += (1, 2)
>>> thetup
(23, 45, 1, 2)

如果语法(a, b) += (1, 2) 被接受,它当然必须暗示相同的功能......但没有任何可能的可观察方法来检查附加是否实际发生,这实际上几乎没有意义。好在语法不被接受,因此!-)

【讨论】:

  • 就是这样。我正在使用 data = (0,0) 和 data += ... 并且它有效。谢谢!
【解决方案2】:

您将两个概念混合在一起。 Python 支持tuple unpacking,它允许您在一行中分配多个变量。

+= 运算符被解释器扩展,因为它只是一个速记。您的示例 ((a, b) += (1, 2)) 将扩展为:

(a, b) = (a, b) + (1, 2)

当你看它时,它并没有多大意义。请记住,元组解包仅适用于将值分配给变量。

【讨论】:

  • 是的,你是对的。但是我的第一个例子(计数,总数)是有道理的。
【解决方案3】:

如果你想处理数值数组,我推荐使用 numpy http://numpy.scipy.org/

它允许你这样做:

>>> from numpy import *
>>> count_total = array((0,0))
>>> count_total += (1,2)
>>> count_total
array([1, 2])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2011-01-14
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多