Re: [Python] Toglietemi un dubbio sugli scope delle variabili.

2024-05-23 Per discussione Yuri


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 "", line 1, in 
  File "", 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


[Python] Toglietemi un dubbio sugli scope delle variabili.

2024-05-23 Per discussione Gabriele Battaglia

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


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.

--
Gabriele Battaglia (IZ4APU)
--... ...--  -.. .  .. --.. - .- .--. ..-  - ..-  . .
Sent from my Giant Desktop PC

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