<div dir="ltr">2013/9/18 Piergiuliano Bossi <span dir="ltr"><<a href="mailto:pgbossi@gmail.com" target="_blank">pgbossi@gmail.com</a>></span><br><div class="gmail_extra"><div class="gmail_quote"><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr"><div>In Python le liste sono mutabili e c'e' ben poco che si possa fare senza mutarle manipolandole,</div></div></blockquote><div><br></div><div>Prendine atto. E' un dato di fatto. Python ha liste mutabili. Ogni volta che ho usato un linguaggio con liste mutabili (Python, Lisp) ho desiderato avere liste immutabili. Ogni volta che ho usato un linguaggio con liste immutabili, avrei voluto avere liste mutabili.</div>

<div><br></div><div>Semplicemente ci sono classi di problemi che si risolvono meglio con una struttura dati mutabile e altri con una immutabile. In alcuni casi scrivere funzionale e' semplicemente una cosa vincente, in altri casi ha un costo sulle performance tendenzialmente fastidioso.</div>

<div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div> 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:</div>

</div></blockquote><div><br></div><div>Questo e' semplicemente un problema tipico della programmazione ad oggetti classica (ovvero escludendo linguaggi ad oggetti che lavorano principalmente con oggetti immutabili). E lo risolvi esattamente negli stessi modi. Tipicamente non vuoi azione a distanza.</div>

<div><br></div><div>Ovvero, in quei casi in cui sei ragionevolmente sicuro che la lista che ti viene passata non mantenga reference al di fuori del tuo mondo, puoi anche non copiarla. In quei casi in cui invece hai timore che succeda, la devi copiare. Ma lo stesso faresti con qualunque oggetto mutabile che non abbia un'identita' personale.</div>

<div><br></div><div>Poi figurati, ti capisco. Vorrei *tanto* avere liste immutabili. Ah, uno di questi giorni...</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr"><div>Usare un array.array non cambia le cose di fatto, introducendo tutta un'altra categoria di limitazioni.</div></div></blockquote><div><br></div><div>Array serve per cose ben precise. Salva la vita, a volte, ma non e questo il caso.</div>

<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div> 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).</div>

</div></blockquote><div><br></div><div>Ottima intuizione. Non lo e'.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Per cui la mia domanda e', quando volete manipolare strutture tipo array senza mutarle o mutandole in copia:</div>

<div>1) le copiate all'inizio come dicevo sopra</div></div></blockquote><div><br></div><div>Esatto.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr"><div>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)</div>

</div></blockquote><div><br></div><div>No no no no! :)</div><div> </div><div><br></div><div><br></div><div> Aggiungo, io normalmente *non* uso [:].</div><div><br></div><div>def __init__(self, people):</div><div>    self.people = list(people)</div>

<div><br></div><div>Il motivo? Voglio avere controllo sulla struttura dati dentro la mia classe. E' mia responsabilita' e la voglio gestire io.</div><div>Se voglio un set, faro' set(people), se voglio una lista faro' cosi'.</div>

<div><br></div><div>In teoria il mio chiamante mi puo' legittimamente passare quello che gli pare, a patto che io possa costruirci una lista. </div><div>Non voglio pero' essere limitato dalla semantica che lui ha scelto per la struttura dati che stava usando. Sia perche' potrebbe non implementare l'interfaccia che mi serve (e in questo caso sarebbe, diciamo, un errore suo), sia perche' e' proprio una sequenza diversa da una lista.</div>

<div><br></div></div><div><br></div>-- <br> .<br>..: -enrico-
</div></div>