LinuxLudus: Python-domande varie

John Leach john.leach@syger.com
Gio 22 Maggio 2008 15:08:03 CEST


Ciao Valerio

Valerio Pachera wrote:
> 2008/5/22 John Leach <john.leach@syger.com>:
>> Concordo con quello che ha detto molto concisamente Federico. Oggi
>> giorno direi che lista == array == vector, tanto quanto map == hash ==
>> dictionary == associated array.
> 
> Perfetto, hai già risposto alla seconda domanda che avevo :)

Era facile indovinare...

>> Una variable e' solo un 'etichetta' ad un valore, che in realta' (almeno
>> per Python, come Ruby, e C#) e' sempre un oggetto. Quindi
>>
>> nome = "carlo"
>> nomi = ["carlo","valerio",christian"]
>>
>> Sia nome sia nomi sono variabili che 'puntano' ad *un solo valore*, una
>> stringha nel primo caso, ed una lista nella seconda.
> 
> Bene bene, quindi una lista è un puntatore alle aree di memoria (se
> così si può dire).

Fermo li! Non rendere le cose piu' difficile di quanto sono. I concetti 
basiliare sono importantissimo, ma basialiare. L'errore era mio, non 
avrei dovuto parlare di puntatori (anche se ho solo detto punta). Per 
utilizare un istanze di una classe (cioe' un oggetto) dovremmo darlo un 
nome. Punto e basta. Una lista e' un oggeto che io decido di chiamare 
lista, o pippo, o todo. Idem qualunque altro oggetto, un numero, 
stringha, mappa, ecc. Pensa ad un alias. Italia e un alias per una massa 
di terra, circondato da mare, ed una linea geo-politico.

> Questo esempio penso chiarisca il concetto di puntatore (lo scrivo per
> chiarirmi le idee io, ma potrebbe interessare qualcun'altro).
> 
> #code=utf-8
> lista1 = range (10)
> lista2 = lista1

Beh la realta' e' un po piu' semplice. lista1 (un nome) e' un alias del 
oggetto range(10). lista2 (un nome) e' un alias del nome lista1, che e' 
un alias del oggetto range(10) - cioe' anche lista2 e' un alias *dello 
stesso oggetto* range(10)

> lista1.remove (5)
> print lista2
> 
> #restituisce  [0, 1, 2, 3, 4, 6 , 7 ,9] nonostante l'operazione di
> rimozione sia stata fatta su lista1 e non lista2.

Proprio perche lista1 e lista2 erano due alias per lo stesso oggetto.

> Al contrario, con le "semplici" variabili, il contenuto della
> variabile viene passato come valore e non come riferimento
> (terminologia basic)
> 
> #code=utf-8
> var1= "ciao"
> var2 = var1
> 
> var1="hallo"
> print var2
> 
> #stampa "ciao" e non "hallo"

No No No No No. Non c'e' un contrario, e' lo stesso sistema di prima. 
Due alias allo stesso oggetto, solo adesso l'oggetto e' una stringa.
Ma poi hai deciso di usare il nome var1 per essere l'alias di un altro 
oggetto (un'altra stringa "hallo"). Mentre var1 continua ad essere 
l'alias dello stringa "ciao".
Non e' stato cambiato il concetto a fatto, hai semplicemente usato un 
esempio un po' piu' complesso.

> E' possibile passare i valori per riferimento alle variabili in python?

Se Python e' come Ruby, non ha senso il concetto di "valore per 
riferimento". Byebye Basic. E meglio pensare che il nome del parametro 
*e'* l'oggetto, cioe' l'alias al oggetto, e basta. Un po' come accettare 
che il modello Newtoniano spiega la gravita'. Non e' proprio vero, come 
ha spiegato Einstein, ma basta per quello che serve a noi.

>> La lista
>> naturalmente contiene altri oggetti, me se vogliamo essere pedantico,
>> anche la stringha (perche' contiene caratteri). Non per nulla che si usa
>> la stessa sintasse in questi casi per estrarre un elemento:
>>
>> primo_carattere = nome[0]
>> primo_nome = nomi[0]
> 
> confermo:
> 
> #code=utf-8
> for lettera in "parola":
> 	print lettera
> 
> stampa
> p
> a
> r
> o
> l
> a
> 
>> FYI (anche se lo sai ;-)
>> http://groups.google.com/group/it.comp.lang.python/topics
> 
> Non lo sapevo, vado a darci un'occhiata.
> 

+1 per il John ;-)

>> A volte pero` e` _obbligatorio_ che una sequenza sia immutabile, e
> l'esempio classico sono le chiavi dei dizionari
> 
> Ok, pensavo potesse avere a che fare con le performance, ad esempio
> occupare meno memoria, invece è una questione di concetto.
> 
> Grazie!

Prego.

John


Maggiori informazioni sulla lista linuxludus