Что именно делает + = в python? - PullRequest
90 голосов
/ 30 января 2011

Мне нужно знать, что + = делает в python. Это так просто. Я также был бы признателен за ссылки на определения других сокращенных инструментов в python.

Ответы [ 11 ]

115 голосов
/ 30 января 2011

В 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

Надеюсь, это поможет.

100 голосов
/ 30 января 2011

+= добавляет другое значение к значению переменной и присваивает новое значение переменной.

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

-=, *=, /= делает то же самое для вычитания, умножения и деления.

27 голосов
/ 30 января 2011

+= добавляет число к переменной, изменяя саму переменную в процессе (тогда как + не будет).Аналогично этому, есть следующее, которое также изменяет переменную:

  • -=, вычитает значение из переменной, устанавливает переменную в результат
  • *=, умножаетпеременная и значение, делающие результат переменной
  • /=, делит переменную на значение, делая результат переменной
  • %=, выполняет модуль для переменной спеременная затем устанавливается на результат

Могут быть и другие.Я не программист на Python.

25 голосов
/ 04 мая 2017

x += 5 не совсем то же самое, что сказать x = 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]

См. Для справки: Почему + = неожиданно ведет себя в списках?

16 голосов
/ 30 января 2011

Добавляет правый операнд слева. x += 2 означает x = x + 2

Он также может добавлять элементы в список - см. этот поток SO .

14 голосов
/ 03 мая 2017

Это не просто синтаксический ярлык. Попробуйте это:

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 , которые по-разному работают со списками.

7 голосов
/ 10 мая 2018

Условно a + = b «добавляет» b к сохранению результата в a. Это упрощенное описание будет описывать оператор + = во многих языках.

Однако упрощенное описание поднимает пару вопросов.

  1. Что именно мы подразумеваем под «добавлением»?
  2. Что именно мы подразумеваем под «сохранением результата в»? Переменные python не хранят значения напрямую, они хранят ссылки на объекты.

В python ответы на оба эти вопроса зависят от типа данных a.


Так что именно означает "добавление"?

  • Для чисел это означает добавление чисел.
  • Для списков, кортежей, строк и т. Д. Это означает конкатенацию.

Обратите внимание, что для списков + = более гибок, чем +, для оператора + в списке требуется другой список, но оператор + = примет любую итерацию.


Так что же значит "хранить значение в"?

Если объект изменчив, тогда рекомендуется (но не обязательно) выполнять модификацию на месте. Таким образом, точка указывает на тот же объект, что и раньше, но этот объект теперь имеет другое содержимое.

Если объект неизменен, то он, очевидно, не может выполнить модификацию на месте. Некоторые изменяемые объекты могут также не иметь реализации операции добавления на месте. В этом случае переменная «а» будет обновлена, чтобы указывать на новый объект, содержащий результат операции сложения.

Технически это реализуется путем поиска сначала __IADD__, если это не реализовано, то пробуется __ADD__ и, наконец, __RADD__.


Требуется осторожность при использовании + = в python для переменных, где мы не уверены в точном типе и, в частности, когда мы не уверены, является ли тип изменчивым или нет. Например, рассмотрим следующий код.

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] будет успешно добавлено в список, на который ссылается [0], но затем произойдет исключение, когда код попытается и не сможет переназначить [0].

3 голосов
/ 26 июля 2017
+= 

- это просто ярлык для записи

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

Поэтому вместо этого вы должны написать

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

Оба способа верны, но пример два помогает вам написать немного меньше кода

1 голос
/ 15 января 2019

Краткий ответ += можно перевести как «добавьте все, что находится справа от + =, к переменной слева от + =».

Пример.Если у вас есть a = 10, то a += 5 будет: a = a + 5

Итак, "a" теперь равно 15.

0 голосов
/ 15 июля 2017

Помните, когда вы использовали для суммирования, например, 2 и 3, в своем старом калькуляторе, и каждый раз, когда вы нажимаете =, вы видите 3, добавленные к итогу, += выполняет аналогичную работу.Пример:

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8
...