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
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.
>>>classAdder(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 +=3in __iadd__ 3>>> a
5
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.
„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,9In[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]
+=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
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 .
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ń.
Co dokładnie rozumiemy przez „dodawanie”?
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].
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 +=2and1>>> x
3>>> x =2>>> x = x +2and1>>> x
1
Zwróć uwagę, że pierwszy przypadek rozwija się do:
>>> x =2>>> x = x +(2and1)>>> x
3
Bardziej prawdopodobne jest, że spotkasz się z tym w „prawdziwym świecie” z innymi operatorami, np
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:
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.
object.__iadd__
Odpowiedzi:
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.Mam nadzieję że to pomoże.
źródło
__iadd__
zwrot innego typu (który sam można+=
dodaje kolejną wartość do wartości zmiennej i przypisuje nową wartość do zmiennej.-=
,*=
,/=
Czy podobny do odejmowania, mnożenia i dzielenia.źródło
x += 5
nie jest dokładnie tym samym, co mówieniex = x + 5
w Pythonie.Uwaga tutaj:
Zobacz dla odniesienia: Dlaczego + = zachowuje się nieoczekiwanie na listach?
źródło
x += 7,8,9
+=
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 wynikMogą być inni. Nie jestem programistą Pythona.
źródło
&=
,>>=
etc.) oraz dodatkowych operatorów matematycznych (**=
, etc.).Dodaje prawy operand po lewej stronie.
x += 2
znaczyx = x + 2
Może również dodawać elementy do listy - zobacz ten wątek SO .
źródło
Nie jest to zwykły skrót składniowy. Spróbuj tego:
przeciw
Pokazuje to, że + = wywołuje metodę listy iadd , ale + wywołuje add , które robią różne rzeczy z listami.
źródło
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ń.
W Pythonie odpowiedzi na oba te pytania zależą od typu danych a.
Więc co dokładnie oznacza „dodawanie”?
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.
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:
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].
źródło
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 = 10
toa += 5
byłoby:a = a + 5
Zatem „a” teraz równa się 15.
źródło
Uwaga
x += y
nie jest tym samym, cox = x + y
w 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.Zwróć uwagę, że pierwszy przypadek rozwija się do:
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
źródło
+=
to tylko skrót do pisaniaWięc zamiast tego napiszesz
Oba sposoby są poprawne, ale przykład drugi pomaga napisać trochę mniej kodu
źródło
Jak powiedzieli również inni, operator + = jest skrótem. Przykład:
Można to również napisać tak:
Zamiast pisać pierwszy przykład, możesz po prostu napisać drugi, który będzie działał dobrze.
źródło
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:źródło
Widzę wiele odpowiedzi, które nie powodują użycia + = z wieloma liczbami całkowitymi.
Jeden przykład:
Byłoby to podobne do:
i nie:
źródło
Zgodnie z dokumentacją
Tak
x += 3
samo jakx = x + 3
.wyświetli 5.
Zauważ, że jest też
źródło