2011-01-23 6 views
7

Perché non è operator.iadd(x, y) equivalente a z = x; z += y? E in che modo operator.iadd(x, y) differisce da operator.add(x, y)?In che modo le funzioni dell'operatore sul posto di Python sono diverse dalle funzioni standard dell'operatore?

Dal docs:

Molte operazioni hanno un versione “in-place”. Le seguenti funzioni forniscono un accesso più primitivo agli operatori sul posto di rispetto alla normale sintassi ; ad esempio, l'istruzione x + = y è equivalente a x = operator.iadd (x, y). Un altro modo per dire che operator.iadd (x, y) equivale a l'istruzione composta z = x; z + = y.

Related question, ma non sono interessato ai metodi di classe Python; solo operatori regolari su tipi Python integrati.

risposta

21

In primo luogo, è necessario comprendere la differenza tra __add__ e __iadd__.

Il metodo __add__ di un oggetto è un'aggiunta regolare: accetta due parametri, restituisce la somma e non modifica alcun parametro.

Il metodo __iadd__ di un oggetto accetta anche due parametri, ma apporta la modifica sul posto, modificando il contenuto del primo parametro. Poiché ciò richiede la mutazione degli oggetti, i tipi immutabili (come i tipi di numeri standard) non dovrebbero avere un metodo __iadd__.

a + b utilizza __add__. a += b utilizza __iadd__ se esiste; se non lo fa, lo emula tramite __add__, come in tmp = a + b; a = tmp. operator.add e operator.iadd differiscono allo stesso modo.

Per l'altra domanda: operator.iadd(x, y) non equivale a z = x; z += y, perché se non esiste __iadd____add__ saranno utilizzati invece. È necessario assegnare il valore per garantire che il risultato sia archiviato in entrambi i casi: x = operator.iadd(x, y).

Potete vedere voi stessi abbastanza facilmente:

import operator 
a = 1 
operator.iadd(a, 2) 
# a is still 1, because ints don't have __iadd__; iadd returned 3 

b = ['a'] 
operator.iadd(b, ['b']) 
# lists do have __iadd__, so b is now ['a', 'b'] 
+0

http://docs.python.org/2/reference/datamodel.html#object.__iadd__ Si noti che le assegnazioni aumentata poteva ma non ha modificare l'oggetto sul posto – lig

+0

Perché Python è progettato con assegnazioni aumentate che funzionano sul posto? È piuttosto controintuitivo, perché quando impariamo la lingua di solito impariamo prima i compiti con valori immutabili. Quindi è un po 'inaspettato che con i valori mutabili l'assegnazione aumentata si comporti diversamente. Si sente piuttosto implicito e incline agli errori. – max

0

Forse perché alcuni oggetti Python sono immutabili.

Sto indovinando operator.iadd(x, y) equivale a z = x; z += y solo per tipi mutabili come dizionari ed elenchi, ma non per tipi immutabili come numeri e stringhe.

Problemi correlati