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.

_______________________________________________
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python

Rispondere a