Forum >> Principianti >> Capire quando usare la parola chiave "global"

Pagina: 1

Salve a tutti,



Sono alle prese con le funzioni, namespace, ecc. e ho una domanda di chiarimento sull'uso di "global".

Ho compreso che le variabili all'interno di una funzione sono variabili private e locali e non utilizzabili al di fuori della funzione stessa. Caveat: se la funzione ha un "return" allora si puo' associare il valore di una variabile interna ad una variabile esterna e globale, penso....




-- Le variabili globali sono tutte le variabili definite nel programma principale e fuori dalle funzioni.

-- Le variabili globali sono utilizzabili ovunque, anche dentro le funzioni.




La parola chiave "global" si usa quando: esistono una variabile globale esterna ed una variabile locale che hanno lo stesso nome e si vuole usare o modificare la variabile globale esterna all'interno della funzione stessa.

N.B. una variable globale esterna puo essere usata da una funzione per calcoli, ecc. ma non si puo' avere la variabile globale direttamente all'interno della funzione, direi, a meno che non si usi "global".




Grazie!

Confuso83



Non è facile scrivere una risposta rapida su un argomento così complesso. L'architettura concettuale che ci sta dietro è piuttosto sofisticata. La cosa migliore è sempre studiare con un buon libro sottomano. Ricordo che il Lutz faceva un buon lavoro a spiegare queste cose.


Una cosa che dovresti leggere è la sezione relativa del tutorial ufficiale, visto che (oltre tutto) è disponibile in traduzione italiana (fatta indovina da chi): https://pytutorial-it.readthedocs.io/it/python3.9/classes.html#scope-e-namespace-in-python


E' molto densa, ma se riesci a digerire lentamente parola per parola, è anche molto molto utile.


Detto questo, la risposta rapida alla tua domanda è: preferibilmente, non usare mai global. Fai solo pasticci con i namespace, e non è questo il modo in cui si dovrebbero fare le cose.


Global segnala che, all'interno del blocco in cui è dichiarato (per esempio una funzione), i riferimenti a un nome sono da intendersi riferiti allo spazio globale, non allo spazio locale del blocco. Questo serve, in pratica, per ri-assegnare un valore a un nome che vive nello spazio globale, dall'interno di uno spazio locale.




L'esempio canonico è questo: ovviamente non c'è nessun problema a *leggere* il valore di un nome definito nello spazio globale, da dentro uno spazio locale:

>>> n = 42
>>> def f():
...     return n - 2
...
>>> f()
40


Tuttavia non puoi ri-assegnare (*scrivere*) un nome globale da dentro uno spazio locale:

>>> n = 42
>>> def f():
...     n = 10
...
>>> f()
>>> n
42
A meno che, appunto, tu non usi global per dire che il nome che usi nello spazio locale deve intendersi come riferito allo spazio globale, non a quello locale.

>>> n = 42
>>> def f():
...     global n
...     n = 10
...
>>> f()
>>> n
10
Ovviamente questa è una pessima idea, ma appunto, alla brutta con global si può fare.


Ora però, mi raccomando, mi raccomando, mi raccomando: NON limitarti a questa ricettina da copincollare per dire che hai "capito" global, perché davvero, i nomi, i namespace, gli scope in Python sono complessi e davvero dovresti seguire un buon manuale... altrimenti hai solo superato una collinetta ma vai a sbattere dieci metri più in là (non ti dico le classi...)




Pagina: 1



Esegui il login per scrivere una risposta.