151

我需要知道+=Python 中的功能。就是这么简单。我也很欣赏 Python 中其他速记工具定义的链接。

4

15 回答 15

173

在 Python 中,是特殊方法+=的糖衣,或者如果不存在。类的方法可以为所欲为。列表对象实现了它并使用它来迭代一个可迭代对象,将每个元素附加到自身,就像列表的扩展方法一样。__iadd____add____radd____iadd____iadd__

__iadd__这是一个实现特殊方法的简单自定义类。您使用 int 初始化对象,然后可以使用+=运算符添加数字。我在其中添加了一个打印语句__iadd__以显示它被调用。此外,__iadd__预计会返回一个对象,所以我返回了自身的加法加上在这种情况下有意义的其他数字。

>>> class Adder(object):
        def __init__(self, num=0):
            self.num = num

        def __iadd__(self, other):
            print 'in __iadd__', other
            self.num = self.num + other
            return self.num
    
>>> a = Adder(2)
>>> a += 3
in __iadd__ 3
>>> a
5

希望这可以帮助。

于 2011-01-30T20:31:48.120 回答
159

+=将另一个值与变量的值相加,并将新值赋给变量。

>>> x = 3
>>> x += 2
>>> print x
5

-=, *=,/=对减法、乘法和除法的作用类似。

于 2011-01-30T06:02:28.240 回答
61

x += 5x = x + 5与Python中的说法不完全相同。

注意这里:

In [1]: x = [2, 3, 4]    

In [2]: y = x    

In [3]: x += 7, 8, 9    

In [4]: x
Out[4]: [2, 3, 4, 7, 8, 9]    

In [5]: y
Out[5]: [2, 3, 4, 7, 8, 9]    

In [6]: x += [44, 55]    

In [7]: x
Out[7]: [2, 3, 4, 7, 8, 9, 44, 55]    

In [8]: y
Out[8]: [2, 3, 4, 7, 8, 9, 44, 55]    

In [9]: x = x + [33, 22]    

In [10]: x
Out[10]: [2, 3, 4, 7, 8, 9, 44, 55, 33, 22]    

In [11]: y
Out[11]: [2, 3, 4, 7, 8, 9, 44, 55]

请参阅参考:为什么 += 在列表中出现意外行为?

于 2017-05-04T14:18:52.277 回答
33

+=向变量添加一个数字,在过程中更改变量本身(而+不会)。与此类似,以下内容也修改了变量:

  • -=,从变量中减去一个值,将变量设置为结果
  • *=, 将变量和一个值相乘,使结果成为变量
  • /=, 将变量除以值,使结果成为变量
  • %=, 对变量进行取模,然后将变量设置为它的结果

可能还有其他人。我不是 Python 程序员。

于 2011-01-30T06:05:29.487 回答
26

它不仅仅是一种语法糖。尝试这个:

x = []                 # empty list
x += "something"       # iterates over the string and appends to list
print(x)               # ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']

相对

x = []                 # empty list
x = x + "something"    # TypeError: can only concatenate list (not "str") to list

+=运算符调用__iadd__()列表方法,而一个+调用__add__()一个。他们用列表做不同的事情。

于 2017-05-03T18:05:42.067 回答
16

它将右边的操作数添加到左边。 x += 2方法x = x + 2

它还可以将元素添加到列表中 - 请参阅此 SO 线程

于 2011-01-30T06:03:06.493 回答
10

理论上 a += b 将 b“添加”到 a 中,并将结果存储在 a 中。这种简单的描述将描述多种语言中的 += 运算符。

然而,简单的描述引发了几个问题。

  1. 我们所说的“添加”到底是什么意思?
  2. “将结果存储在一个”中究竟是什么意思?python变量不直接存储值,它们存储对对象的引用。

在 python 中,这两个问题的答案都取决于 a 的数据类型。


那么“添加”到底是什么意思呢?

  • 对于数字,它意味着数字加法。
  • 对于列表、元组、字符串等,它意味着连接。

请注意,对于列表 += 比 + 更灵活,列表上的 + 运算符需要另一个列表,但 += 运算符将接受任何可迭代的。


那么“将值存储在 a 中”是什么意思呢?

如果对象是可变的,则鼓励(但不是必需)就地执行修改。因此 a 指向它之前所做的相同对象,但该对象现在具有不同的内容。

如果对象是不可变的,那么它显然无法就地执行修改。一些可变对象也可能没有就地“添加”操作的实现。在这种情况下,变量“a”将被更新为指向一个包含加法运算结果的新对象。

从技术上讲,这是通过__IADD__先查找来实现的,如果没有实现,则__ADD__尝试最后__RADD__


在我们不确定确切类型的变量上使用 += 时需要小心,特别是在我们不确定类型是否可变的情况下。例如考虑以下代码。

def dostuff(a):
    b = a
    a += (3,4)
    print(repr(a)+' '+repr(b))

dostuff((1,2))
dostuff([1,2])

当我们使用元组调用 dostuff 时,元组会作为 += 操作的一部分被复制,因此 b 不受影响。但是,当我们使用列表调用它时,列表会被原地修改,因此 a 和 b 都会受到影响。

在 python 3 中,“bytes”和“bytearray”类型观察到类似的行为。


最后请注意,即使对象没有被替换,也会发生重新分配。如果左侧只是一个变量,这并不重要,但是当您有一个引用可变集合的不可变集合时,它可能会导致令人困惑的行为,例如:

a = ([1,2],[3,4])
a[0] += [5]

在这种情况下,[5] 将成功添加到由 a[0] 引用的列表中,但随后当代码尝试重新分配 a[0] 并且未能重新分配时,将引发异常。

于 2018-05-10T01:03:15.373 回答
7

注意x += yx = x + y在某些情况下包含附加运算符的情况不同,因为运算符优先级以及总是首先评估右侧的事实,例如

>>> x = 2
>>> x += 2 and 1
>>> x
3

>>> x = 2
>>> x = x + 2 and 1
>>> x
1

注意第一种情况扩展为:

>>> x = 2
>>> x = x + (2 and 1)
>>> x
3

您更有可能在与其他运营商的“现实世界”中遇到这种情况,例如

x *= 2 + 1== x = x * (2 + 1)!=x = x * 2 + 1

于 2019-11-04T12:13:51.247 回答
4

简短的回答+=可以翻译为“将 += 右侧的任何内容添加到 += 左侧的变量中。

前任。如果你有,a = 10那么a += 5将是: a = a + 5

所以,“a”现在等于 15。

于 2019-01-15T16:25:24.740 回答
3

+=只是写作的捷径

number = 4
number = number + 1

所以你会写

numbers = 4
numbers += 1

两种方法都是正确的,但是示例二可以帮助您编写更少的代码

于 2017-07-26T09:18:51.373 回答
1

根据文档

x += y相当于x = operator.iadd(x, y)。另一种说法z = operator.iadd(x, y)是,相当于复合语句z = x; z += y

所以x += 3是一样的x = x + 3

x = 2

x += 3

print(x)

将输出 5。

注意还有

于 2020-07-31T16:36:04.543 回答
1

让我们看看 CPython 为x += y和生成的字节码x = x = y。(是的,这是依赖于实现的,但它让您了解正在实现的语言定义的语义。)

>>> import dis
>>> dis.dis("x += y")
  1           0 LOAD_NAME                0 (x)
              2 LOAD_NAME                1 (y)
              4 INPLACE_ADD
              6 STORE_NAME               0 (x)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
>>> dis.dis("x = x + y")
  1           0 LOAD_NAME                0 (x)
              2 LOAD_NAME                1 (y)
              4 BINARY_ADD
              6 STORE_NAME               0 (x)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE

两者之间的唯一区别是用于运算符的字节码:INPLACE_ADDfor+=BINARY_ADDfor +

BINARY_ADD使用x.__add__(或y.__radd__如果需要)实现,因此与 .x = x + y大致相同x = x.__add__(y)。两者都__add__并且__radd__通常返回新实例,而不修改任何一个参数。

INPLACE_ADD使用x.__iadd__. 如果不存在,则x.__add__使用 then 代替它。x.__iadd__通常返回x,因此结果STORE_NAME不会更改 的所指对象x,尽管该对象可能已发生变异。(事实上​​,目的INPLACE_ADD是提供一种改变对象的方法,而不是总是创建一个新对象。)

例如,int.__iadd__未定义,因此x += 7xis anint与 相同时x = x.__add__(y),设置x为 的新实例int

另一方面,list.__iadd__是定义的,所以x += [7]x是 alist与 相同x = x.__iadd__([9])list.__iadd__有效地调用extend将其参数的元素添加到x. x通过查看重新分配的增强分配之前和之后的值实际上无法判断x,因为相同的对象被分配给名称。

于 2021-07-22T16:39:49.457 回答
0

我看到很多没有使用 += 和多个整数的答案。

一个例子:

x -= 1 + 3

这将类似于:

x = x - (1 + 3)

并不是:

x = (x - 1) + 3
于 2020-05-23T23:16:52.893 回答
0

请记住,当您曾经在旧计算器中求和(例如 2 和 3)时,每次您点击总和时都会=看到 3 相加,结果+=类似。例子:

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8
于 2017-07-15T20:59:35.063 回答
0

正如其他人所说, += 运算符是一种快捷方式。一个例子:

var = 1;
var = var + 1;
#var = 2

也可以这样写:

var = 1;
var += 1;
#var = 2

因此,您可以编写第二个示例,而不是编写第一个示例,这样就可以了。

于 2015-08-17T20:41:35.693 回答