Variabili in Python e variabili in C: differenza

Messaggioda astruso83 » 09/01/2022, 21:44

Salve,

Le variabili in Python sono diverse dalle variabili in C. Per esempio, creare una variabile in Python sembra equivalente a quello che succede quando si crea un puntatore in C... Per esempio, se si creano le due variabili a=3 e b=3, b e a puntano alla stessa area di memoria dove si trova l'intero 3. In C, invece, si verebbero a creare due area di memoria diverse contenenti gli stessi dati, cioe' il numero 3.

Che vantaggi ci sono in Python a creare variabili in questo modo, come puntatori, rispetto a quello che fa il linguaggio C? Perche' questo approccio diverso? Cosa si guadagna?

Grazie!
astruso83
Junior Member
Junior Member
 
Messaggio: 122 di 245
Iscritto il: 19/03/2014, 01:43

Re: Variabili in Python e variabili in C: differenza

Messaggioda apatriarca » 10/01/2022, 18:16

Supponiamo di voler scrivere una funzione che modifica un singolo attributo di un oggetto. In C possiamo implementare tale funzione essenzialmente in due modi:
Codice:
Oggetto modifica_attributo(Oggetto o, Value v) {
    Oggetto oc = o;
    oc.attributo = v;
    return oc;
}

void modifica_attributo(Oggetto *o, Value v) {
    o->attributo = v;
}

In linea di massima la seconda implementazione sarà più efficiente perché non deve copiare tutto l'oggetto se questo fosse grande (nota tuttavia che la scelta di usare il passaggio per copia delle variabili non preclude la possibilità che il compilatore rimuova tale copia se la ritiene non necessaria). Ci sono però certamente delle situazioni in cui si desidera effettivamente una copia e quindi si deve seguire il primo approccio.

L'autore di Python ha probabilmente deciso che il secondo caso è il più comune e l'ha reso il comportamento di default. È tuttavia sempre possibile implementare entrambi i comportamenti anche in Python (anche se è più complicato):
Codice:
import copy

def modifica_attributo(o, v):
    oc = copy.copy(o)
    oc.attributo = v
    return oc

def modifica_attributo(o, v):
    o.attributo = v

Nota che nel caso si scelga di passare i valori per copia come in C, per implementare il passaggio per riferimento esistono sostanzialmente due vie: definire un tipo puntatore/riferimento oppure usare una sintassi particolare come la seguente (in un finto linguaggio):
Codice:
func modifica_attributo(ref o, v) do
    o.attributo = v
end

Questa scelta permette di avere funzioni come questa oppure come swap, senza tuttavia avere un tipo puntatore con tutte le sue problematiche.

Vorrei infine osservare che queste NON sono le uniche scelte possibili, anche se per distinguere alcune delle scelte più complicate potrebbe essere necessario usare esempi più complicati.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5647 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Variabili in Python e variabili in C: differenza

Messaggioda apatriarca » 10/01/2022, 18:32

Visto che conosci il C vorrei osservare anche un terzo tipo di passaggio di valori tipico del preprocessore. Questo prende il nome di pass-by-name e consiste nel sostituire l'espressione passata come argomento nell'espressione della funzione (nel caso del preprocessore chiamata macro). Il codice sopra sarebbe semplicemente uguale a:
Codice:
#define MODIFICA_ATTRIBUTO(o, v) do { (o).attributo = (v); } while (0)

Non è più di tanto interessante e in questo caso è simile al passaggio per riferimento. Tuttavia è possibile anche ottenere cose più particolari come la seguente
Codice:
#define DO_TWICE(op) do { (void)(op); (void)(op); } while (0)

che possiamo usare come segue:
Codice:
int i = 0, j = 0;
while (i < N && j < M) {
    DO_TWICE(X[i++] = Y[j++]);
}

ed è equivalente (dopo aver eliminato le parti che non fanno nulla) al seguente codice:
Codice:
int i = 0, j = 0;
while (i < N && j < M) {
    X[i++] = Y[j++];
    X[i++] = Y[j++];
}

Ovviamente non credo sia una bella idea scrivere qualcosa del genere (ti invito a capire cosa fa), ma è possibile in questo tipo di passaggio di variabili.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5648 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Variabili in Python e variabili in C: differenza

Messaggioda astruso83 » 14/01/2022, 15:47

Grazie apatriarca!

Tutto molto piu' limpido!
astruso83
Junior Member
Junior Member
 
Messaggio: 123 di 245
Iscritto il: 19/03/2014, 01:43


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite