2013-09-25 8 views
6

Sto usando Python già da qualche tempo e oggi durante la lettura del seguente frammento di codice:pitone tupla è immutabile - e allora perché posso aggiungere elementi ad esso

>>> a = (1,2) 
>>> a += (3,4) 
>>> a 
(1, 2, 3, 4) 

mi sono fatto una domanda: come mai le tuple in pitone sono immutabili e posso usare un operatore += su di esse (o, più in generale, perché posso modificare una tupla)? E non potevo rispondere a me stesso.

ho reso l'idea di immutabilità, e, anche se non sono così popolari come liste, tuple sono utili in pitone. Ma essere immutabile e poter modificare la lunghezza mi sembra contraddittorio ...

+0

Vedi http://stackoverflow.com/questions/9097994/arent-python-strings-immutable –

+0

@ColonelPanic sì, un po 'simile problema – ducin

risposta

22

5 è anch'esso immutabile. Quando si dispone di una struttura dati immutabile, a += b equivale a a = a + b, quindi un nuovo numero, tupla o qualsiasi altra cosa viene creata.

Nel fare questo con le strutture mutevoli, la struttura è cambiato.

Esempio:

>>> tup = (1, 2, 3) 
>>> id(tup) 
140153476307856 
>>> tup += (4, 5) 
>>> id(tup) 
140153479825840 

vedere come il id cambiato? Ciò significa che è un oggetto diverso.

Ora, con un list, che è mutevole:

>>> lst = [1, 2, 3] 
>>> id(lst) 
140153476247704 
>>> lst += [4, 5] 
>>> id(lst) 
140153476247704 

Il id dice lo stesso.

+1

ok, quindi ancora non posso aggiungere un elemento di una tupla esistente (che lo rende veramente immutabile), ma un nuovo oggetto viene creato sulla base di altri due oggetti - è vero? – ducin

+0

Esattamente. – Veedrac

+0

Solo una cosa non è ancora chiara nei frammenti. tuple :: '+ =' sta usando due tuple per creare il terzo, la tupla del risultato. Sembra diverso, è diverso con list :: '+ =' - perché sarebbe logico se farebbe lo stesso (e creare una terza lista). Ma 'lst + [4,5]' in effetti rende append due volte. Perché 'list :: + =' segue 'tuple :: + ='? – ducin

2

non sta modificando, è creato un nuovo tuple e cambiato il contenuto della a variabile

cercano a[0] = a[0] + 1 per vedere l'immutabilità

4

Sia += modifica l'oggetto sul posto o non è fino a l'oggetto. Con una tupla, non sta modificando l'oggetto, come si può vedere se si crea un altro che punta variabile allo stesso oggetto:

>>> x = (1, 2) 
>>> y = x 
>>> x += (3, 4) 
>>> y 
(1, 2) 

con oggetti mutabili, come le liste, si vedrà che il valore cambia, mostrando sotto tutti i suoi nomi:

>>> x = [1, 2] 
>>> y = x 
>>> x += [3, 4] 
>>> y 
[1, 2, 3, 4] 
+0

in base alla tua risposta, il comportamento dell'operatore '+ =' è basato su cosa mutevole/immutabile, ed è in-place/not-in-place, rispettivamente. Grazie. – ducin

+1

@tkoomzaaskz: In realtà, il comportamento di '+ =' dipende da ciascun tipo. Se un tipo definisce un metodo '__iadd__', Python lo chiamerà; altrimenti, chiamerà '__add__' (lo stesso metodo usato per' + '). I tipi più immutabili non definiscono '__iadd__', quindi' a + = b' è uguale a 'a = a + b'; i tipi più mutevoli _do_ definiscono '__iadd__', quindi li muta sul posto. – abarnert

Problemi correlati