Co dokładnie robi + = w Pythonie?

118

Muszę wiedzieć, co robi + = w Pythonie. To takie proste. Byłbym również wdzięczny za linki do definicji innych narzędzi short hand w Pythonie.

Salvatore Mucciolo
źródło
5
object.__iadd__
ephemient
2
jest to podstawowy operator dla Pythona (i wielu innych języków), powinieneś zacząć od google, jeśli nigdy nie czytałeś żadnych odniesień do Pythona.
technomage
3
@AndiDog Chociaż prawdą jest, że oba pytania dotyczą operatora (+ =), to, które łączysz, dotyczy wyrafinowanego użycia i subtelnego problemu, a tutaj OP prawdopodobnie nie jest w stanie zastosować tam rozumowania (jeszcze).
Dr. Belisarius
3
@AndiDog Być może miałeś rację w tamtym czasie, ale patrząc na (prawie) przyjęte tutaj rozwiązania, widać jasno, że to pytanie dotyczy podstawowego zrozumienia operatora: D
Dr. belisarius
1
Większość zastosowań sumbol jest teraz zindeksowana na stronie symboli docs.python.org/3/genindex-Symbols.html .
Terry Jan Reedy

Odpowiedzi:

148

W Pythonie + = jest powłoką cukrową dla __iadd__specjalnej metody __add__lub, __radd__jeśli jej __iadd__nie ma. __iadd__Metoda klasy może zrobić wszystko, czego chce. Obiekt listy implementuje go i używa go do iteracji po iterowalnym obiekcie, dołączając każdy element do siebie w taki sam sposób, jak robi to metoda rozszerzenia listy.

Oto prosta klasa niestandardowa, która implementuje __iadd__metodę specjalną. Obiekt inicjalizujesz int, a następnie możesz użyć operatora + =, aby dodać liczbę. Dodałem instrukcję print, __iadd__aby pokazać, że jest wywoływana. __iadd__Oczekuje się również, że zwróci obiekt, więc zwróciłem dodanie siebie i innej liczby, co ma sens w tym przypadku.

>>> 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

Mam nadzieję że to pomoże.

Bryan
źródło
24
Chociaż Asker nie tego szukał, +1 za prawdziwą odpowiedź. =)
Michael
@Michael, tu humor dodaje się do faktu ... :-D
Aaron John Sabu
3
+1 za odpowiedź na pytanie, ale -1 za __iadd__zwrot innego typu (który sam można
dodać
Ta odpowiedź jest zbyt złożona dla typu osoby, która musiałaby zapytać, co oznacza + = (tj. Osoba początkująca). Twoja odpowiedź nie jest odpowiedzią dla początkujących, nie tylko dlatego, że początkujący zwykle nie rozpoczynają nauki Pythona w sposób obiektowy, ale także dlatego, że istnieją znacznie prostsze odpowiedzi (jak poniżej @ Imran). Tylko moje dwa centy, chociaż doceniam tę odpowiedź.
q-compute
129

+= dodaje kolejną wartość do wartości zmiennej i przypisuje nową wartość do zmiennej.

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

-=, *=, /=Czy podobny do odejmowania, mnożenia i dzielenia.

Imran
źródło
19
„siebie” to właściwie bardzo zły opis, ponieważ liczby całkowite są niezmienne.
AndiDog
41

x += 5nie jest dokładnie tym samym, co mówienie x = x + 5w Pythonie.

Uwaga tutaj:

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]

Zobacz dla odniesienia: Dlaczego + = zachowuje się nieoczekiwanie na listach?

Roshan Mehta
źródło
jest tak samo, z wyjątkiem dziwnego przypadkux += 7,8,9
Ufos
Ponadto jeden z połączonych wątków zapewnia dobrą dyskusję na temat tego, gdzie dokładnie się różni. stackoverflow.com/questions/6951792/…
Ufos
31

+=dodaje liczbę do zmiennej, zmieniając samą zmienną w procesie (ale +nie będzie). Podobnie jest z następującymi elementami, które również modyfikują zmienną:

  • -=, odejmuje wartość od zmiennej, ustawiając zmienną na wynik
  • *=, mnoży zmienną i wartość, czyniąc wynik zmienną
  • /=, dzieli zmienną przez wartość, czyniąc wynik zmienną
  • %=, wykonuje moduł na zmiennej, a zmienna jest następnie ustawiana na jej wynik

Mogą być inni. Nie jestem programistą Pythona.

Ryan Bigg
źródło
2
W przypadku liczb ta odpowiedź jest prawidłowa. (Patrz odpowiedź Bryana specjalnego zachowania.) Istnieje rzeczywiście wiele innych, w tym operatorów bitowe ( &=, >>=etc.) oraz dodatkowych operatorów matematycznych ( **=, etc.).
Michael
16

Dodaje prawy operand po lewej stronie. x += 2znaczyx = x + 2

Może również dodawać elementy do listy - zobacz ten wątek SO .

Kaleb Brasee
źródło
15

Nie jest to zwykły skrót składniowy. Spróbuj tego:

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

przeciw

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

Pokazuje to, że + = wywołuje metodę listy iadd , ale + wywołuje add , które robią różne rzeczy z listami.

CS
źródło
7

Fakultatywnie a + = b "dodaje" b do a zapisując wynik w a. Ten uproszczony opis opisywałby operator + = w wielu językach.

Jednak ten uproszczony opis rodzi kilka pytań.

  1. Co dokładnie rozumiemy przez „dodawanie”?
  2. Co dokładnie rozumiemy przez „przechowywanie wyniku w a”? Zmienne Pythona nie przechowują wartości bezpośrednio, lecz przechowują odniesienia do obiektów.

W Pythonie odpowiedzi na oba te pytania zależą od typu danych a.


Więc co dokładnie oznacza „dodawanie”?

  • W przypadku liczb oznacza to dodawanie liczbowe.
  • W przypadku list, krotek, ciągów znaków itp. Oznacza to konkatenację.

Zauważ, że w przypadku list + = jest bardziej elastyczny niż +, operator + na liście wymaga innej listy, ale operator + = zaakceptuje każdą iterację.


Co więc oznacza „przechowywanie wartości w a”?

Jeśli obiekt jest zmienny, zachęca się (ale nie jest to wymagane) do wykonania modyfikacji w miejscu. A więc wskazuje na ten sam obiekt, co wcześniej, ale teraz ma on inną zawartość.

Jeśli obiekt jest niezmienny, to oczywiście nie może wykonać modyfikacji w miejscu. Niektóre obiekty zmienne mogą również nie mieć implementacji operacji „dodawania” w miejscu. W tym przypadku zmienna „a” zostanie zaktualizowana, aby wskazywała nowy obiekt zawierający wynik operacji dodawania.

Z technicznego punktu widzenia jest to realizowane poprzez szukanie __IADD__najpierw, jeśli nie jest to zaimplementowane, to __ADD__jest wypróbowywane i na końcu __RADD__.


Należy zachować ostrożność podczas używania + = w pythonie na zmiennych, w przypadku których nie jesteśmy pewni dokładnego typu, aw szczególności, gdy nie jesteśmy pewni, czy typ jest zmienny, czy nie. Na przykład rozważ następujący kod.

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

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

Kiedy wywołujemy dostuff z krotką, wtedy krotka jest kopiowana jako część operacji + =, więc b pozostaje niezmienione. Jednak kiedy wywołujemy go z listą, lista jest modyfikowana w miejscu, więc wpływa to zarówno na a, jak i b.

W Pythonie 3 podobne zachowanie obserwuje się w przypadku typów „bytes” i „bytearray”.


Na koniec zwróć uwagę, że ponowne przypisanie ma miejsce, nawet jeśli obiekt nie zostanie zastąpiony. Nie ma to większego znaczenia, jeśli lewa strona jest po prostu zmienną, ale może powodować mylące zachowanie, gdy masz niezmienną kolekcję odnoszącą się do kolekcji mutowalnych, na przykład:

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

W tym przypadku [5] zostanie pomyślnie dodany do listy, do której odwołuje się [0], ale potem zostanie zgłoszony wyjątek, gdy kod spróbuje i nie uda się ponownie przypisać [0].

plugwash
źródło
5

Krótką odpowiedź +=można przetłumaczyć jako „dodaj to, co jest po prawej stronie + = do zmiennej po lewej stronie + =”.

Dawny. Jeśli tak, a = 10to a += 5byłoby: a = a + 5

Zatem „a” teraz równa się 15.

Roman Skydan
źródło
Co wnosi ta odpowiedź, co nie zostało jeszcze omówione? To zduplikowana odpowiedź ...
jdv, tylko próbuję pomóc. Jestem nowym współpracownikiem, więc przepraszam, jeśli uważasz, że moja odpowiedź była duplikatem.
Oczywiste jest, że jest to duplikat, jeśli spojrzysz na większość innych odpowiedzi. Współużytkowanie jest w porządku, ale powinieneś postarać się o wniesienie czegoś nowego (np. Odpowiedź add vs iadd) lub chcesz spróbować jaśniejszego rozwiązania. Ale, o ile wiem, odpowiedzi, które zostały najwyżej ocenione, są tak jasne, jak tylko można uzyskać podstawową odpowiedź.
4

Uwaga x += ynie jest tym samym, co x = x + yw niektórych sytuacjach, w których dodawany jest dodatkowy operator ze względu na pierwszeństwo operatora w połączeniu z faktem, że prawa strona jest zawsze oceniana jako pierwsza, np.

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

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

Zwróć uwagę, że pierwszy przypadek rozwija się do:

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

Bardziej prawdopodobne jest, że spotkasz się z tym w „prawdziwym świecie” z innymi operatorami, np

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

Chris_Rands
źródło
4

+= to tylko skrót do pisania

number = 4
number = number + 1

Więc zamiast tego napiszesz

numbers = 4
numbers += 1

Oba sposoby są poprawne, ale przykład drugi pomaga napisać trochę mniej kodu

Vash
źródło
1
Zachowanie jest takie samo w przypadku liczb, ale ogólnie nie jest takie samo.
plugwash
0

Jak powiedzieli również inni, operator + = jest skrótem. Przykład:

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

Można to również napisać tak:

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

Zamiast pisać pierwszy przykład, możesz po prostu napisać drugi, który będzie działał dobrze.

ZeroFunter
źródło
0

Pamiętaj, że kiedy zwykłeś sumować, na przykład 2 i 3, w swoim starym kalkulatorze i za każdym razem, gdy trafiasz =, widzisz 3 dodane do sumy, +=robi to podobnie. Przykład:

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8
salhin
źródło
0

Widzę wiele odpowiedzi, które nie powodują użycia + = z wieloma liczbami całkowitymi.

Jeden przykład:

x -= 1 + 3

Byłoby to podobne do:

x = x - (1 + 3)

i nie:

x = (x - 1) + 3
Javier Perez
źródło
0

Zgodnie z dokumentacją

x += yjest równoważne x = operator.iadd(x, y). Innym sposobem z = operator.iadd(x, y)wyrażenia tego jest stwierdzenie, że jest to równoważne z instrukcją złożoną z = x; z += y.

Tak x += 3samo jak x = x + 3.

x = 2

x += 3

print(x)

wyświetli 5.

Zauważ, że jest też

Tiago Martins Peres 李大仁
źródło