Cosa fa esattamente + = in Python?


118

Ho bisogno di sapere cosa fa + = in Python. È così semplice. Apprezzerei anche i collegamenti alle definizioni di altri strumenti a mano breve in Python.



2
è un operatore di base per python (e anche per molti altri linguaggi), dovresti iniziare con google, se non leggi mai riferimenti a python.
technomage

3
@AndiDog Sebbene sia vero che entrambe le domande riguardano l'operatore (+ =), quella che hai collegato riguarda un utilizzo sofisticato e un problema sottile, e l'OP qui probabilmente non è in grado di seguire il ragionamento lì (ancora).
Dr. belisarius il

3
@AndiDog Forse avevi ragione in quel momento, ma guardando le soluzioni (quasi) accettate qui, è chiaro che questa domanda riguarda una comprensione di base dell'operatore: D
Dr. belisarius

1
La maggior parte degli usi di sumbol sono ora indicizzati nella pagina Simboli docs.python.org/3/genindex-Symbols.html .
Terry Jan Reedy

Risposte:


148

In Python, + = è il rivestimento di zucchero per il __iadd__metodo speciale, o __add__o __radd__se __iadd__non è presente. Il __iadd__metodo di una classe può fare tutto ciò che vuole. L'oggetto list lo implementa e lo usa per iterare su un oggetto iterabile aggiungendo ogni elemento a se stesso nello stesso modo in cui lo fa il metodo di estensione dell'elenco.

Ecco una semplice classe personalizzata che implementa il __iadd__metodo speciale. Si inizializza l'oggetto con un int, quindi è possibile utilizzare l'operatore + = per aggiungere un numero. Ho aggiunto un'istruzione print __iadd__per mostrare che viene chiamato. Inoltre, __iadd__dovrebbe restituire un oggetto, quindi ho restituito l'aggiunta di se stesso più l'altro numero che ha senso in questo caso.

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

Spero che questo ti aiuti.


24
Anche se questo non è ciò che il richiedente stava cercando, +1 per la risposta reale. =)
Michael

@Michael, ecco dove l'umorismo si aggiunge al fatto ... :-D
Aaron John Sabu

3
+1 per rispondere alla domanda, ma -1 per un tipo __iadd__che restituisce un tipo diverso (che a sua volta è aggiungibile)
Caleth

Questa risposta è troppo complessa per il tipo di persona che dovrebbe chiedere cosa significa + = (cioè un principiante). La tua risposta non è una risposta per principianti, non solo perché i principianti di solito non iniziano ad imparare Python in modo orientato agli oggetti, ma anche perché ci sono risposte molto più semplici (come quella di @ Imran sotto). Solo i miei due centesimi, anche se apprezzo questa risposta.
q-compute

129

+= aggiunge un altro valore con il valore della variabile e assegna il nuovo valore alla variabile.

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

-=, *=, /=Fa simile per sottrazione, moltiplicazione e divisione.


19
"stesso" è in realtà una descrizione molto negativa qui, poiché gli interi sono immutabili.
AndiDog

41

x += 5non è esattamente lo stesso di dire x = x + 5in Python.

Nota qui:

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]

Vedere per riferimento: Perché + = si comporta in modo imprevisto negli elenchi?


è lo stesso, però, tranne che per il caso stranox += 7,8,9
UFO

Inoltre, uno dei thread collegati fornisce una buona discussione su dove esattamente differisce. stackoverflow.com/questions/6951792/…
UFO

31

+=aggiunge un numero a una variabile, modificando la variabile stessa nel processo (mentre +non lo farebbe). Simile a questo, ci sono i seguenti che modificano anche la variabile:

  • -=, sottrae un valore dalla variabile, impostando la variabile sul risultato
  • *=, moltiplica la variabile e un valore, rendendo il risultato la variabile
  • /=, divide la variabile per il valore, rendendo il risultato la variabile
  • %=, esegue il modulo sulla variabile, con la variabile quindi impostata sul risultato di essa

Potrebbero essercene altri. Non sono un programmatore Python.


2
Per i numeri, questa risposta è corretta. (Vedere la risposta di Bryan per il comportamento speciale.) Ci sono infatti molti altri, tra cui operatori bit a bit ( &=, >>=, ecc) e gli operatori matematici addizionali ( **=e così via).
Michael


15

Non è una semplice scorciatoia sintattica. Prova questo:

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

contro

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

Ciò mostra che + = invoca il metodo iadd list ma + invoca add , che fa cose diverse con le liste.


7

Nozionalmente a + = b "aggiunge" b a a memorizzare il risultato in a. Questa descrizione semplicistica descriverebbe l'operatore + = in molte lingue.

Tuttavia la descrizione semplicistica solleva un paio di domande.

  1. Cosa intendiamo esattamente con "aggiunta"?
  2. Cosa si intende esattamente per "memorizzare il risultato in un"? le variabili python non memorizzano i valori direttamente, ma memorizzano i riferimenti agli oggetti.

In python le risposte a entrambe queste domande dipendono dal tipo di dati di un file.


Allora cosa significa esattamente "aggiungere"?

  • Per i numeri significa addizione numerica.
  • Per elenchi, tuple, stringhe, ecc. Significa concatenazione.

Nota che per gli elenchi + = è più flessibile di +, l'operatore + in un elenco richiede un altro elenco, ma l'operatore + = accetterà qualsiasi iterabile.


Allora cosa significa "memorizzare il valore in un"?

Se l'oggetto è modificabile, è incoraggiato (ma non obbligatorio) eseguire la modifica sul posto. Quindi a punta allo stesso oggetto che faceva prima, ma quell'oggetto ora ha un contenuto diverso.

Se l'oggetto è immutabile, ovviamente non può eseguire la modifica sul posto. Alcuni oggetti modificabili potrebbero anche non avere un'implementazione di un'operazione di "aggiunta" sul posto. In questo caso la variabile "a" verrà aggiornata per puntare a un nuovo oggetto contenente il risultato di un'operazione di addizione.

Tecnicamente questo viene implementato cercando __IADD__prima, se non viene implementato, __ADD__viene provato e infine __RADD__.


È richiesta attenzione quando si usa + = in python su variabili di cui non si è certi del tipo esatto e in particolare dove non si è certi se il tipo è mutabile o meno. Si consideri ad esempio il codice seguente.

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

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

Quando invochiamo dostuff con una tupla, la tupla viene copiata come parte dell'operazione + = e quindi b non viene influenzata. Tuttavia, quando lo invochiamo con una lista, la lista viene modificata in posizione, quindi sia a che b sono influenzati.

In python 3, si osserva un comportamento simile con i tipi "bytes" e "bytearray".


Infine, nota che la riassegnazione avviene anche se l'oggetto non viene sostituito. Questo non ha molta importanza se il lato sinistro è semplicemente una variabile, ma può causare un comportamento confuso quando si dispone di una raccolta immutabile che fa riferimento a raccolte modificabili, ad esempio:

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

In questo caso [5] verrà aggiunto con successo alla lista a cui fa riferimento uno [0] ma in seguito verrà sollevata un'eccezione quando il codice tenta e non riesce a riassegnare uno [0].


5

La risposta breve è +=può essere tradotta come "aggiungi tutto ciò che si trova a destra di + = alla variabile a sinistra di + =".

Ex. Se lo hai, a = 10allora a += 5sarebbe: a = a + 5

Quindi, "a" ora è uguale a 15.


Cosa contribuisce questa risposta che non è già stata discussa? È una risposta duplicata ...

jdv, sto solo cercando di aiutare. Sono un nuovo collaboratore, quindi mi dispiace se pensi che la mia risposta fosse un duplicato.

È chiaro che è un duplicato se guardi la maggior parte delle altre risposte. Va bene contribuire, ma dovresti sforzarti di contribuire con qualcosa di nuovo (ad esempio, come la risposta add vs iadd) o vuoi provare una soluzione più chiara. Ma, per quanto ne so, le risposte più votate sono le più chiare che puoi ottenere per una risposta di base.

4

Nota x += ynon è la stessa che x = x + yin alcune situazioni in cui è incluso un operatore aggiuntivo a causa della precedenza dell'operatore combinata con il fatto che il lato destro viene sempre valutato per primo, ad es.

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

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

Nota che il primo caso si espande in:

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

È più probabile che tu lo incontri nel "mondo reale" con altri operatori, ad es

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


4

+= è solo una scorciatoia per scrivere

number = 4
number = number + 1

Quindi invece scriveresti

numbers = 4
numbers += 1

Entrambi i modi sono corretti, ma l'esempio due ti aiuta a scrivere un po 'meno codice


1
Il comportamento è lo stesso sui numeri ma non è lo stesso in generale.
plugwash

0

Come altri hanno anche detto, l'operatore + = è una scorciatoia. Un esempio:

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

Potrebbe anche essere scritto così:

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

Quindi, invece di scrivere il primo esempio, puoi semplicemente scrivere il secondo, che funzionerebbe perfettamente.


0

Ricorda quando solevi sommare, ad esempio 2 e 3, nella tua vecchia calcolatrice e ogni volta che premi il =3 vedi aggiunto al totale, +=fa un lavoro simile. Esempio:

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

0

Vedo molte risposte che non vengono visualizzate utilizzando + = con più numeri interi.

Un esempio:

x -= 1 + 3

Questo sarebbe simile a:

x = x - (1 + 3)

e non:

x = (x - 1) + 3

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.