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.
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.
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.
>>> 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.
__iadd__
zwrot innego typu (który sam można
x += 5
nie jest dokładnie tym samym, co mówienie x = x + 5
w 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?
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.
&=
, >>=
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 .
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.
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.
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].
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
to a += 5
byłoby: a = a + 5
Zatem „a” teraz równa się 15.
Uwaga x += y
nie jest tym samym, co x = 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.
>>> 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
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.
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
Zgodnie z dokumentacją
x += y
jest równoważnex = operator.iadd(x, y)
. Innym sposobemz = 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 += 3
samo jak x = x + 3
.
x = 2
x += 3
print(x)
wyświetli 5.
Zauważ, że jest też
object.__iadd__