Что именно + = делает в Python?

118

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

Сальваторе Муччиоло
источник
5
object.__iadd__
ephemient
2
это основной оператор для python (и многих других языков тоже), вам следует начать с google, если вы никогда не читали ссылки на python.
technomage
3
@AndiDog Хотя это правда, что оба вопроса касаются оператора (+ =), тот, который вы связали, касается сложного использования и тонкой проблемы, и OP здесь, вероятно, не может следовать рассуждениям там (пока).
Д-р Велизарий
3
@AndiDog Возможно, вы были правы в то время, но, глядя на (почти) принятые решения здесь, становится ясно, что этот вопрос касается базового понимания оператора: D
Доктор Велизариус
1
Большинство использований sumbol теперь индексируются на странице символов docs.python.org/3/genindex-Symbols.html .
Терри Ян Риди

Ответы:

150

В 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

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

Bryan
источник
24
Хотя это не то, что искал спрашивающий, +1 за настоящий ответ. =)
Майкл
@Michael, вот где юмор добавляет факту ... :-D
Аарон Джон Сабу
3
+1 за ответ на вопрос, но -1 за то, __iadd__что возвращает другой тип (который сам по себе может быть добавлен)
Калет 01
Этот ответ слишком сложен для человека, которому нужно спросить, что означает + = (например, новичок). Ваш ответ не является ответом для новичков не только потому, что новички обычно не начинают изучать Python объектно-ориентированным способом, но также потому, что есть гораздо более простые ответы (например, @ Imran ниже). Всего лишь два цента, хотя я ценю этот ответ.
q-compute
129

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

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

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

Имран
источник
19
"сам" здесь на самом деле очень плохое описание, поскольку целые числа неизменяемы.
AndiDog
41

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]

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

Рошан Мехта
источник
но это то же самое, за исключением странного случаяx += 7,8,9
Ufos
Кроме того, одна из связанных веток дает хорошее обсуждение того, где именно она отличается. stackoverflow.com/questions/6951792/…
Ufos
31

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

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

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

Райан Бигг
источник
2
Для чисел это правильный ответ. (См . Ответ Брайана об особом поведении.) На самом деле существует несколько других, включая побитовые операторы ( &=, >>=и т. Д.) И дополнительные математические операторы ( **=и т. Д.).
Майкл
16

Он добавляет правый операнд к левому. x += 2средстваx = x + 2

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

Калеб Браси
источник
15

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

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 , который делает разные вещи со списками.

CS
источник
7

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

Однако упрощенное описание вызывает несколько вопросов.

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

В Python ответы на оба этих вопроса зависят от типа данных файла.


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

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

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


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

Если объект является изменяемым, рекомендуется (но не обязательно) выполнить изменение на месте. Таким образом, 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], но не сможет.

plugwash
источник
5

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

Ex. Если бы у вас было, a = 10то a += 5было бы: a = a + 5

Итак, «а» теперь равно 15.

Роман Скидан
источник
Что дает этот ответ, что еще не обсуждалось? Это дублированный ответ ...
jdv, просто пытаюсь помочь. Я новый участник, извините, если вы считаете, что мой ответ повторяется.
Понятно, что это дубликат, если вы посмотрите на большинство других ответов. Вносить свой вклад - это нормально, но вы должны стремиться внести что-то новое (например, как ответ add vs iadd), или вы хотите попытаться найти более четкое решение. Но, насколько я могу судить, ответы, получившие наибольшее количество голосов, настолько ясны, насколько вы можете получить базовый ответ.
4

Примечание x += y- это не то же самое, что x = 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

Chris_Rands
источник
4

+= это просто ярлык для написания

number = 4
number = number + 1

Вместо этого вы бы написали

numbers = 4
numbers += 1

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

Vash
источник
1
То же самое и с числами, но в целом не то же самое.
plugwash
0

Как также говорили другие, оператор + = - это ярлык. Пример:

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

Это также можно было бы написать так:

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

Поэтому вместо того, чтобы писать первый пример, вы можете просто написать второй, который будет работать нормально.

ZeroFunter
источник
0

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

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8
Salhin
источник
0

Я вижу много ответов, которые не возникают при использовании + = с несколькими целыми числами.

Один пример:

x -= 1 + 3

Это будет похоже на:

x = x - (1 + 3)

и нет:

x = (x - 1) + 3
Хавьер Перес
источник
0

Согласно документации

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.

Обратите внимание, что есть также

Тьяго Мартинс Перес 李大仁
источник