Що саме робить + = у python?


118

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



2
це основний оператор для python (і багато інших мов теж), вам слід почати з google, якщо ви ніколи не читаєте жодних посилань python.
техногенез

3
@AndiDog Хоча це правда, що обидва питання стосуються оператора (+ =), той, з яким ви пов’язані, стосується складного використання та тонкої проблеми, і ОП тут, мабуть, не в змозі дотримуватися міркувань там (поки).
доктор Белісарій

3
@AndiDog Можливо, ви мали рацію в той час, але, дивлячись на (майже) прийняті рішення тут, зрозуміло, що це питання стосується базового розуміння оператора: D
доктор belisarius

1
Більшість застосувань суми зараз індексується на сторінці Symbols docs.python.org/3/genindex-Symbols.html .
Terry Jan Reedy

Відповіді:


148

У 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

Сподіваюся, це допомагає.


24
Хоча запитувач не це шукав, +1 для реальної відповіді. =)
Майкл

@Michael, ось де гумор додає факту ... :-D
Аарон Джон Сабу

3
+1 для відповіді на запитання, але -1 для відповіді, __iadd__яке повертає інший тип (який можна додати)
Caleth,

Ця відповідь є надто складною для типу людини, якій потрібно запитати, що означає + = (тобто для початківця). Ваша відповідь - це не відповідь для початківців, не тільки тому, що початківці зазвичай не починають вивчати Python об'єктно-орієнтованим способом, а й тому, що є набагато простіші відповіді (наприклад, @ Imran's нижче). Всього два мої центи, хоча я ціную цю відповідь.
q-обчислити

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
Для чисел ця відповідь правильна. (Див відповідь Брайана для особливої поведінки.) Там є дійсно кілька інших, в тому числі операторів порозрядному ( &=, >>=і т.д.) і додаткові математичні оператори ( **=і т.д.).
Майкл


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, але + викликає додати , що робить різні списки зі списками.


7

Умовно a + = b "додає" b до збереження результату в a. Цей спрощений опис описує + = оператор багатьма мовами.

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

  1. Що саме ми маємо на увазі під «додаванням»?
  2. Що саме ми маємо на увазі під "зберіганням результату в"? Змінні 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])

Коли ми викликаємо достуф з кортежем, то кортеж копіюється як частина операції + =, тому b не впливає. Однак, коли ми викликаємо його зі списком, список змінюється на місці, тому впливають і а, і b.

У python 3 подібна поведінка спостерігається з типами "байт" та "bytearray".


Нарешті зауважте, що перепризначення відбувається, навіть якщо об'єкт не замінений. Це не має великого значення, якщо ліва частина є просто змінною, але це може спричинити заплутану поведінку, коли у вас є незмінна колекція, що стосується, наприклад, змінних колекцій:

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

У цьому випадку [5] буде успішно доданий до списку, на який посилається [0], але потім буде виняток виняток, коли код намагається і не присвоїть повторне призначення [0].


5

Коротку відповідь +=можна перекласти як "додати все, що знаходиться праворуч від + =, до змінної зліва від + =".

Вих. Якщо у вас a = 10тоді це a += 5було б: a = a + 5

Отже, "а" зараз дорівнює 15.


Що сприяє цій відповіді, про яку вже не йшлося? Це повторюваний відповідь ...

jdv, просто намагаюся допомогти. Я новий довідник, так що вибачте, якщо ви вважаєте, що моя відповідь була дублікатом.

Зрозуміло, що це дублікат, якщо подивитися на більшість інших відповідей. Це добре робити внесок, але ви повинні прагнути внести щось нове (наприклад, наприклад, відповідь на додавання до 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


4

+= це лише ярлик для написання

number = 4
number = number + 1

Тож замість цього ви б писали

numbers = 4
numbers += 1

Обидва способи правильні, але приклад два допомагає написати трохи менше коду


1
Поведінка однакова в цифрах, але в цілому не однакова.
підключення

0

Як також говорили інші, оператор + = - це ярлик. Приклад:

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

Це також можна записати так:

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

Тож замість того, щоб писати перший приклад, ви можете просто написати другий, який би спрацював чудово.


0

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

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

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.

Зауважте, що також є

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.