Ho bisogno di sapere cosa fa + = in Python. È così semplice. Apprezzerei anche i collegamenti alle definizioni di altri strumenti a mano breve in Python.
Ho bisogno di sapere cosa fa + = in Python. È così semplice. Apprezzerei anche i collegamenti alle definizioni di altri strumenti a mano breve in Python.
Risposte:
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.
__iadd__
che restituisce un tipo diverso (che a sua volta è aggiungibile)
+=
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.
x += 5
non è esattamente lo stesso di dire x = x + 5
in 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?
x += 7,8,9
+=
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 essaPotrebbero essercene altri. Non sono un programmatore Python.
&=
, >>=
, ecc) e gli operatori matematici addizionali ( **=
e così via).
Aggiunge l'operando destro a sinistra. x += 2
si intendex = x + 2
Può anche aggiungere elementi a un elenco - vedere questo thread SO .
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.
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.
In python le risposte a entrambe queste domande dipendono dal tipo di dati di un file.
Allora cosa significa esattamente "aggiungere"?
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].
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 = 10
allora a += 5
sarebbe: a = a + 5
Quindi, "a" ora è uguale a 15.
Nota x += y
non è la stessa che x = x + y
in 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
+=
è 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
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.
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
Secondo la documentazione
x += y
è equivalente ax = operator.iadd(x, y)
. Un altro modo per dirlo è dire chez = operator.iadd(x, y)
è equivalente all'istruzione compostaz = x; z += y
.
Quindi x += 3
è lo stesso di x = x + 3
.
x = 2
x += 3
print(x)
produrrà 5.
Nota che c'è anche
object.__iadd__