[Python] Il dilemma degli array mutabili

Riccardo Lemmi riccardo a reflab.com
Mer 18 Set 2013 15:58:44 CEST


Piergiuliano Bossi wrote:

> Un'altra cosa che mi spiazza e' la seguente: sono abituato a
> manipolare e trasformare array immutabili, in cui ogni trasformazione
> ti ritorna una copia dell'array di partenza, per cui ci puoi fare le
> piu' immani schifezze senza effetti collaterali.
> ...

Crei la nuova lista leggendo da quella vecchia:

newl = []
for i in oldl:
   newl.append(applica_shifezze_varie_su(i))

(stessa cosa con le comprehension)

> In Python le liste sono mutabili e c'e' ben poco che si possa fare
> senza mutarle manipolandole, per cui in un metodo che riceve una lista
> in ingresso mi sono trovato spesso a copiarle in una variabile locale
> prima di lavorarci sopra:
>     import copy
>     def yada(foo):
>         bar = copy.copy(foo)
>         # ecc.
> 
> Usare un array.array non cambia le cose di fatto, introducendo tutta
> un'altra categoria di limitazioni. Le tuple sono immutabili, ma non
> funzionano nel senso che ho spiegato sopra (si', lo so, per la append
> potrei creare una nuova tupla e passarle in ingresso una lista
> concatenata della vecchia tupla e del nuovo elemento, ma non mi sembra
> il modo in cui il BDFL le ha intese).
> 
> Per cui la mia domanda e', quando volete manipolare strutture tipo
> array senza mutarle o mutandole in copia:
> 1) le copiate all'inizio come dicevo sopra
> 2) non usate liste, ma tuple, ma poi come compensate la mancanza di
> append e remove (sembra una contraddizione in termini ma non lo e',
> basterebbe che append e remove ritornino nuove strutture dati, copie
> dell'originale) 3) vi toccate (cit)
> 
> Ho come la sensazione che Marco dira': usa una comprehension, che non
> e' una cattiva idea, ci mancherebbe, ma le comprehension mal si
> prestano quando l'algoritmo che stai implementando e' modellato su
> append() e remove() o sbaglio?
> 
> Grazie e ciao
> Giuliano
> 

Mi sfugge il caso, forse un esempio chiarirebbe... L'unico posto in cui 
vedo male il codice messo sopra è quello in cui si usano gli elementi 
dell'array non in sequenza ma pescando in "qua e la'"

-- 
                                       Riccardo Lemmi



Maggiori informazioni sulla lista Python