关于运算符:在python中+ =做了什么?

What exactly does += do in python?

我需要知道+=在Python中的作用。就这么简单。我还希望链接到Python中其他短期工具的定义。


在python中,+=是用于__iadd__特殊方法的糖衣,如果不存在__iadd__,则为__add____radd__。类的__iadd__方法可以做任何它想做的事情。列表对象实现它,并使用它迭代一个可Iterable对象,将每个元素附加到它本身,方法与列表的extend方法相同。

这是一个简单的自定义类,它实现了__iadd__特殊方法。使用int初始化对象,然后可以使用+=运算符添加数字。我在__iadd__中添加了一个print语句,以显示它被调用了。另外,__iadd__应该返回一个对象,所以我返回了它本身加上在本例中有意义的另一个数字的加法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 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

希望这有帮助。


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

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

-=*=/=在减法、乘法和除法上都有相似之处。


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

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

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


x += 5与python中的x = x + 5不完全相同。

请注意:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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]

请参阅:为什么+=在列表中的行为异常?


它将右操作数添加到左操作数。x += 2表示x = x + 2

它还可以向列表中添加元素——请参阅这个so线程。


这不仅仅是一种句法上的捷径。试试这个:

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

对战

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

这说明,+=调用IADD列表方法,但+调用Add,后者对列表执行不同的操作。


从概念上讲,a+=b"将"b添加到a中,并将结果存储到a中。这种简单的描述将用多种语言描述+=运算符。

然而,这种简单的描述提出了几个问题。

  • "添加"到底是什么意思?
  • "将结果存储在"究竟是什么意思?python变量不直接存储值,而是存储对对象的引用。
  • 在python中,这两个问题的答案取决于a的数据类型。

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

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

    注意,对于lists+=比+,列表上的+运算符需要另一个列表,但+=运算符将接受任何iterable。

    那么"将值存储在"是什么意思呢?

    如果对象是可变的,则鼓励(但不是必需)就地执行修改。所以a指向它以前做过的同一个对象,但是这个对象现在有不同的内容。

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

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

    在python中对不确定确切类型的变量使用+=时,尤其是在不确定类型是否可变的情况下,需要小心。例如,考虑下面的代码。

    1
    2
    3
    4
    5
    6
    7
    def dostuff(a):
        b = a
        a += (3,4)
        print(repr(a)+' '+repr(b))

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

    当我们用一个元组调用dostuf时,该元组将被复制为+=操作的一部分,因此b不受影响。但是,当我们使用列表调用它时,列表会在适当的位置进行修改,因此A和B都会受到影响。

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

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

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

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


    1
    +=

    只是写作的捷径

    1
    2
    3
    numbers = 1
    numbers = numbers + 1
    print (numbers)   ## 2

    所以你应该写

    1
    2
    3
    numbers = 1
    numbers += 1
    print (numbers)   ## 2

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


    简短的答案是+=,可以翻译为"将+=右边的内容添加到+=左边的变量中"。

    例:如果你有a = 10,那么a += 5应该是:a = a + 5

    所以,"A"现在等于15。


    记住,当你用旧计算器求和(例如2&3)时,每当你点击=时,你会看到3加在总数上,+=也会做类似的工作。例子:

    1
    2
    3
    4
    5
    6
    7
    >>> orange = 2
    >>> orange += 3
    >>> print(orange)
    5
    >>> orange +=3
    >>> print(orange)
    8

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

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

    也可以这样写:

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

    因此,您可以不编写第一个示例,而只编写第二个示例,这会很好地工作。