[Python] Toglietemi un dubbio sugli scope delle variabili.

Yuri yurj a alfa.it
Gio 23 Maggio 2024 16:42:11 CEST


Il 23/05/24 12:04, Gabriele Battaglia ha scritto:
> Ciao a tutti.
>
> Per favore, leggete questa affermazione e, per non rubarvi tempo 
> prezioso, rispondetemi solo se è falsa e perchè.
>
>
> Delle variabili e della loro visibilità all'interno di uno script 
> python, io ho capito questo.
>
>
> All'inizio dello script, a indentazione 0 diciamo, dopo aver importato 
> i moduli e dichiarato le costanti, io scrivo
>
>
> pippo=True
>
>
> Bene. Dovrei aver detto che pippo è vero e l'ho detto a livello più 
> basso del codice. Ora, se io non dichiaro altri pippo all'interno di 
> funzioni o moduli, l'unico pippo della vita mia, dovrebbe essere e 
> rimanere, quello assegnato a True, all'inizio.
>
> Tipo, se 2000 righe dopo, e annidato all'interno di una selva di 
> indentazioni, dentro un if al dodicesimo leivello di tab scrivo che
>
>
> if pluto == "12345": pippo=False


Questo codice è dentro una funzione? Se è dentro una funzione, 
localmente crei una variabile pippo che sovrascrive l'altra ma uscito 
dalla funzione ritrovi l'originale. Mi pare se ne fosse discusso di 
recente. Se invece vuoi che questa pippo sia quella dell'inizio, devi 
usare global (o nonlocal ma con limiti) davanti oppure passarla come 
parametro.

In lettura, invece, funziona che trova la pippo che stava in alto e usa 
quel valore.

https://programnotes.altervista.org/ambiti-e-variabili-locali-e-globali/

Esempio chiarificatore:

 >>> x = 15
 >>> def funzione_esempio():
...     x += 2
...     return x
...
 >>> print(funzione_esempio())
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "<stdin>", line 2, in funzione_esempio
UnboundLocalError: cannot access local variable 'x' where it is not 
associated with a value

MA:

 >>> x = 15
 >>> def funzione_esempio():
...     x = 10
...     return x
...
 >>> print(funzione_esempio())
10
 >>> x
15

MA:

 >>> def funzione_esempio():
...     y = x
...     y = y + 2
...     return y
...
 >>> print(funzione_esempio())
17

https://www.programmareinpython.it/video-corso-python-base/12-variabili-globali-e-variabili-locali/

Quindi quando ridefinisci l'etichetta della variabile, come fai tu 
sopra, la crei localmente alla funzione ma uscito dalla funzione 
ritroverai la pippo iniziale.

In python le variabili sono delle etichette collegate a qualcosa. Quando 
entri in una funzione, le etichette che vengono create localmente sono 
nuove e dentro quella funzione. Avendo lo stesso nome, ovviamente, ti 
sarà impossibile richiamare delle etichette all'esterno. Se provi a 
modificare le etichette esterne usando il loro stesso valore (x += 2), 
Python prima crea la nuova etichetta x, poi prova a leggerla ma non è 
ancora assegnata a nulla, e quindi da l'errore sopra.


>
>
> finito l'if, fatti eventuali return da mille funzioni, chiusi cicli 
> while, loop vari, tutto quello che volete.
>
> Dopo 5000 righe di codice, tornato a livello di indentazione 0.. Se 
> vado a vedere il mio pippo...
>
> Troverò sempre quello giusto? Cioè True se la condizione di 
> pluto=="12345" non era vera, oppure False se lo era... ma la mia 
> variabile pippo è sempre e solo quella.
>
>
> Chiedo tutto ciò perchè ho uno script che fa più o meno questo, in 
> termini generici, tuttavia la variabile non la leggo correttamente e 
> non capisco cosa mi sfugga, da anni, in questa maledetta scemenza 
> dello scope che dovrebbe essere proprio una sciocchezza, eppure, 
> evidentemente sono più rincoglionito di quanto mi piaccia credere.
>
>
> Grazie per il vostro aiuto.
>
>
> Gabry.
>


Maggiori informazioni sulla lista Python