Re: [Python] Indagine su una variabile.

2022-09-19 Per discussione Gabriele Battaglia

Grazie Massimo.

Siccome è passato molto tempo da che mi scrivesti questa risposta, la 
riporto qui sotto per intero.


Da parte mia, e di tutti i principianti come me, ti ringrazio per la 
chiarezza su questa caratteristica di Python e, immagino, di tutti i 
linguaggi di programmazione che risulta un po ostica agli inizi.


Buona giornata.

Gabry.


Reply to Massimo Masson's message, wrote on 25/07/2022 at 20:35:

Il 25/07/2022 15:20, Gabriele Battaglia ha scritto:
[...]
Riprendendo il tuo esempio ti chiedo, a cosa serve allora la parola 
chiave global?


Se io dichiaro una variabile a livello main, poi la modifico 
all'interno di una funzione di livello più alto e naturalmente me la 
aspetto modificata quando esco da queste funzioni, perchè dovrei 
avere la necessità di dichiarare che quella variabile è global, 
all'interno delle mie funzioni?


Non so se sono riuscito a spiegare il mio dubbio.


Provo a dirti la mia, vediamo se siamo sulla stessa lunghezza d'onda...

global serve per consentire di utilizzare una variabile fuori dal suo 
scope (contesto) naturale.


Per quel che so lo si usa o all'interno di una funzione, o per 
definire variabili "globali" tra moduli per scambio informazioni.


Sto sull'uso all'interno di una funzione, penso sia più facile per me 
da spiegare.


Quando entri in una funzione, questa definisce il suo "scope". Le 
variabili definite nella funzione hanno come scope la funzione 
medesima. Quando esci dalla funzione, spariscono.


Se vuoi modificare una variabile definita fuori dalla funzione, allora 
usi la keyword global, così la funzione capisce che lo scope è esterno 
a se' stessa, e si vuole usare la variabile "esterna" e non quella 
della funzione.


Nota che se ad una variabile assegni un valore nel corpo della 
funzione python assume sia locale (a meno che non la dichiari global).
Le variabili solo referenziate all'interno di una funzione invece sono 
implicitamente global.

Un esempio aiuta:

m = 1

def duplica():
    global m
    m = m * 2
    print(m)

duplica()

Ti restituisce il valore 2.
Se provi a togliere la riga "global m" ottieni... un errore:
local variable 'm' referenced before assignment.
Questo perché hai usato la variabile prima di "dichiararla".
Nota che se sostiuissi "global m" con "m = 7" (ad esempio) non avresti 
più l'errore, la stampa di "m dentro duplica" darebbe 14, la stampa di 
"m fuori duplica" darebbe... ancora 1 (la "m" esterna alla funzione).


Ovvero, la variabile definita dentro la funzione "oscura" la variabile 
esterna alla funzione, a meno che non la dichiari global, ed in tal 
caso anche dentro la funzione utilizzi la variabile esterna (appunto, 
globale).


Aiuta?

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


--
--... ...--  -.. .  .. --.. - .- .--. ..-  - ..-  . .
Sent from TB on Windows 10, Genus Bononiae's computer.

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


Re: [Python] Indagine su una variabile.

2022-07-25 Per discussione Massimo Masson

Il 25/07/2022 15:20, Gabriele Battaglia ha scritto:
[...]
Riprendendo il tuo esempio ti chiedo, a cosa serve allora la parola 
chiave global?


Se io dichiaro una variabile a livello main, poi la modifico all'interno 
di una funzione di livello più alto e naturalmente me la aspetto 
modificata quando esco da queste funzioni, perchè dovrei avere la 
necessità di dichiarare che quella variabile è global, all'interno delle 
mie funzioni?


Non so se sono riuscito a spiegare il mio dubbio.


Provo a dirti la mia, vediamo se siamo sulla stessa lunghezza d'onda...

global serve per consentire di utilizzare una variabile fuori dal suo 
scope (contesto) naturale.


Per quel che so lo si usa o all'interno di una funzione, o per definire 
variabili "globali" tra moduli per scambio informazioni.


Sto sull'uso all'interno di una funzione, penso sia più facile per me da 
spiegare.


Quando entri in una funzione, questa definisce il suo "scope". Le 
variabili definite nella funzione hanno come scope la funzione medesima. 
Quando esci dalla funzione, spariscono.


Se vuoi modificare una variabile definita fuori dalla funzione, allora 
usi la keyword global, così la funzione capisce che lo scope è esterno a 
se' stessa, e si vuole usare la variabile "esterna" e non quella della 
funzione.


Nota che se ad una variabile assegni un valore nel corpo della funzione 
python assume sia locale (a meno che non la dichiari global).
Le variabili solo referenziate all'interno di una funzione invece sono 
implicitamente global.

Un esempio aiuta:

m = 1

def duplica():
global m
m = m * 2
print(m)

duplica()

Ti restituisce il valore 2.
Se provi a togliere la riga "global m" ottieni... un errore:
local variable 'm' referenced before assignment.
Questo perché hai usato la variabile prima di "dichiararla".
Nota che se sostiuissi "global m" con "m = 7" (ad esempio) non avresti 
più l'errore, la stampa di "m dentro duplica" darebbe 14, la stampa di 
"m fuori duplica" darebbe... ancora 1 (la "m" esterna alla funzione).


Ovvero, la variabile definita dentro la funzione "oscura" la variabile 
esterna alla funzione, a meno che non la dichiari global, ed in tal caso 
anche dentro la funzione utilizzi la variabile esterna (appunto, globale).


Aiuta?

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


Re: [Python] Indagine su una variabile.

2022-05-17 Per discussione Yuri

Ciao,

 serve, appunto, a segnalare che stai usando quella globale. Se cambi 
la tua funzione in modo che stampi solo d senza definirla, ti tornerà 1:


>>> def mo():
...  print(d)
...
>>> d=1
>>> mo()
1

Se invece vuoi modificarla, allora la devi definire localmente (ma resta 
lì) oppure usare global.


>>> def mo():
...  global d
...  d=2
...  print(d)
...
>>> d=1
>>> mo()
2
>>> d
2

>>> def mo():
...  d=2
...  print(d)
...
>>> d=1
>>> mo()
2
>>> d
1


Il 17/05/22 16:55, Gabriele Battaglia ha scritto:


Reply to Yuri's message, wrote on 05/05/2022 at 17:03:


Il 05/05/22 16:16, Gabriele Battaglia ha scritto:
Chiedo venia, so che non si dice così ma non mi viene un termine 
migliore, forse inspecting... :)



Comunque.

Ho una variabile dichiarata ad inizio script, del tipo: d={}


poi una routine la modifica, ovviamente ha lo stesso nome 
all'interno della funzione che non riceve () e non restituisce nulla 
con return.


All'uscita da questa funzione tuttavia, mi ritrovo d intatta, come 
se non avessi apportato alcuna modifica.


All'interno ti risulta modificata?
Ciao Yuri. Sì, è modificata.


Ti copio dalla console.


>>> def mo():
...     d=2
...     print(d)
...     return
...
>>> d
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'd' is not defined
>>> d=1
>>> d
1
>>> mo()
2
>>> d
1



Allora. parlando di scopes, io avevo capito che quando ti riferisci ad 
una variabile, Python crea una variabile locale se non ne esiste già 
una con lo stesso nome. Cioè, se la variabile a cui mi riferisco 
esiste già ed è stata creata da uno scope superiore, tipo il main in 
questo caso, allora usa quella.


A questo punto allora però la mia confusione cresce perchè non capisco 
più a cosa serva la chiave global



:)


Devo tornare a leggere le basi di Python. Povero me.

Gabry. :)

il mio consiglio è lanciare lo script via pdb (o la parte di script 
che interessa valutare). Puoi anche aprire un prompt interattivo di 
python e all'interno definire la tua variabile d e poi


>> from script import funzionemodificad

>> pdb.runcall(funzionemodificad)

in questo modo puoi vedere passo passo cosa succede. Alla fine della 
funzione torni al prompt e hai la tua variabile d, che puoi stampare 
con un print.






Come si indaga su un problema di questo genere? Io non riesco a 
trovare l'inghippo.



Grazie per il vostro sempre illuminante aiuto.


Gabry.



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



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


Re: [Python] Indagine su una variabile.

2022-05-06 Per discussione Yuri


Il 06/05/22 09:34, Yuri ha scritto:

Ciao,

 se non si modifica la variabile all'interno della funzione, si può 
usare la variabile esterna:


>>> d = 0
>>> def test():
...   print(d)
...
>>> test()
0

Se invece si tenta di modificarla:

>>> def test():
...  print(d)
...  d = 1
...
>>> d = 0
>>> test()
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 2, in test
UnboundLocalError: local variable 'd' referenced before assignment


Scusate, ovviamente qui l'errore è dovuto al fatto che uso d e poi la 
ricreo localmente. Qui python vede l'assegnazione e decide che la 
variabile è locale, quindi quando esegue il codice vede un riferimento a 
d prima che questa venga creata localmente. Se invece facessi solo 
"print(d)" o "d=1", l'errore non ci sarebbe stato perché o usa solo il 
valore globale o crea una nuova variabile locale.





Ci pare di capire che Gabriele vuole modificarla ma non ottiene 
l'errore, e quindi potrebbe essere questa la situazione:


>>> d = {}
>>> def test():
...  d[0] = 1
...
>>> test()
>>> d
{0: 1}

qui non viene dato errore perché d non viene modificata ma solo usata 
come puntatore al contenuto del dizionario.


Magari con queste informazioni Gabriele ha un quadro più chiaro.

Gabriele: puoi mostrarci il codice o almeno la parte essenziale?

Il 06/05/22 08:44, Luigi Russo ha scritto:


Il 05/05/2022 16:16, Gabriele Battaglia ha scritto:
Chiedo venia, so che non si dice così ma non mi viene un termine 
migliore, forse inspecting... :)



Comunque.

Ho una variabile dichiarata ad inizio script, del tipo: d={}


poi una routine la modifica, ovviamente ha lo stesso nome 
all'interno della funzione che non riceve () e non restituisce nulla 
con return.


All'uscita da questa funzione tuttavia, mi ritrovo d intatta, come 
se non avessi apportato alcuna modifica.



Come si indaga su un problema di questo genere? Io non riesco a 
trovare l'inghippo.


Gigi:


Ciao Gabriel,

se intendi modificare la variabile globale d dovrai inserire nella 
funzione la parola chiave global, esempio:



d = {}


def modificad():

    global d

d = {'Cane': 'Bau'}


print(d)


Ciao da Gigi

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

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

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


Re: [Python] Indagine su una variabile.

2022-05-06 Per discussione Yuri

Ciao,

 se non si modifica la variabile all'interno della funzione, si può 
usare la variabile esterna:


>>> d = 0
>>> def test():
...   print(d)
...
>>> test()
0

Se invece si tenta di modificarla:

>>> def test():
...  print(d)
...  d = 1
...
>>> d = 0
>>> test()
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 2, in test
UnboundLocalError: local variable 'd' referenced before assignment

Ci pare di capire che Gabriele vuole modificarla ma non ottiene 
l'errore, e quindi potrebbe essere questa la situazione:


>>> d = {}
>>> def test():
...  d[0] = 1
...
>>> test()
>>> d
{0: 1}

qui non viene dato errore perché d non viene modificata ma solo usata 
come puntatore al contenuto del dizionario.


Magari con queste informazioni Gabriele ha un quadro più chiaro.

Gabriele: puoi mostrarci il codice o almeno la parte essenziale?

Il 06/05/22 08:44, Luigi Russo ha scritto:


Il 05/05/2022 16:16, Gabriele Battaglia ha scritto:
Chiedo venia, so che non si dice così ma non mi viene un termine 
migliore, forse inspecting... :)



Comunque.

Ho una variabile dichiarata ad inizio script, del tipo: d={}


poi una routine la modifica, ovviamente ha lo stesso nome all'interno 
della funzione che non riceve () e non restituisce nulla con return.


All'uscita da questa funzione tuttavia, mi ritrovo d intatta, come se 
non avessi apportato alcuna modifica.



Come si indaga su un problema di questo genere? Io non riesco a 
trovare l'inghippo.


Gigi:


Ciao Gabriel,

se intendi modificare la variabile globale d dovrai inserire nella 
funzione la parola chiave global, esempio:



d = {}


def modificad():

    global d

d = {'Cane': 'Bau'}


print(d)


Ciao da Gigi

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

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


Re: [Python] Indagine su una variabile.

2022-05-06 Per discussione Luigi Russo


Il 05/05/2022 16:16, Gabriele Battaglia ha scritto:
Chiedo venia, so che non si dice così ma non mi viene un termine 
migliore, forse inspecting... :)



Comunque.

Ho una variabile dichiarata ad inizio script, del tipo: d={}


poi una routine la modifica, ovviamente ha lo stesso nome all'interno 
della funzione che non riceve () e non restituisce nulla con return.


All'uscita da questa funzione tuttavia, mi ritrovo d intatta, come se 
non avessi apportato alcuna modifica.



Come si indaga su un problema di questo genere? Io non riesco a 
trovare l'inghippo.


Gigi:


Ciao Gabriel,

se intendi modificare la variabile globale d dovrai inserire nella 
funzione la parola chiave global, esempio:



d = {}


def modificad():

    global d

d = {'Cane': 'Bau'}


print(d)


Ciao da Gigi

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


Re: [Python] Indagine su una variabile.

2022-05-05 Per discussione Massimo Masson

Il 05/05/2022 16:16, Gabriele Battaglia ha scritto:
[...]


Ho una variabile dichiarata ad inizio script, del tipo: d={}


poi una routine la modifica, ovviamente ha lo stesso nome all'interno 
della funzione che non riceve () e non restituisce nulla con return.


All'uscita da questa funzione tuttavia, mi ritrovo d intatta, come se 
non avessi apportato alcuna modifica.


Secondo me è un tema di namespace e scope delle variabili...

Se dichiari una variabile dentro una funzione, il suo scope è interno 
alla funzione. La variabile dichiarata esternamente ha uno scope più ampio.


Quindi la "d" interna alla funzione esaurisce la sua visibilità in 
uscita della stessa.


La "d" esterna alla funzione continua a puntare al dizionario di prima.
Se non è stato modificato, il dizionario resta invariato.
Se invece modifichi il dizionario, anche dentro la funzione, lo ritrovi 
modificato (perché un conto è lo scope della variabile, un conto è 
l'oggetto puntato).


Esempio stupido:

def fanulla(dizionario):
#dizionario[1]="uno"
d = "ciao"
print ("dentro fanulla d vale ", d)

d = {}

print("prima di fanulla d vale ", d)
fanulla(d)
print("dopo fanulla d vale ", d)

Se togli il # dentro la funzione, il dizionario viene modificato.

Oppure non ho capito nulla del tuo problema, in tal caso chiedo venia!
ciao.
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


Re: [Python] Indagine su una variabile.

2022-05-05 Per discussione Yuri


Il 05/05/22 16:16, Gabriele Battaglia ha scritto:
Chiedo venia, so che non si dice così ma non mi viene un termine 
migliore, forse inspecting... :)



Comunque.

Ho una variabile dichiarata ad inizio script, del tipo: d={}


poi una routine la modifica, ovviamente ha lo stesso nome all'interno 
della funzione che non riceve () e non restituisce nulla con return.


All'uscita da questa funzione tuttavia, mi ritrovo d intatta, come se 
non avessi apportato alcuna modifica.


All'interno ti risulta modificata?

il mio consiglio è lanciare lo script via pdb (o la parte di script che 
interessa valutare). Puoi anche aprire un prompt interattivo di python e 
all'interno definire la tua variabile d e poi


>> from script import funzionemodificad

>> pdb.runcall(funzionemodificad)

in questo modo puoi vedere passo passo cosa succede. Alla fine della 
funzione torni al prompt e hai la tua variabile d, che puoi stampare con 
un print.






Come si indaga su un problema di questo genere? Io non riesco a 
trovare l'inghippo.



Grazie per il vostro sempre illuminante aiuto.


Gabry.



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


Re: [Python] Indagine su una variabile.

2022-05-05 Per discussione Carlo Miron
ciao gabriele. hai un esempio minimale che riproduca il problema?

Il giorno gio 5 mag 2022 alle ore 16:17 Gabriele Battaglia
 ha scritto:
>
> Chiedo venia, so che non si dice così ma non mi viene un termine
> migliore, forse inspecting... :)
>
>
> Comunque.
>
> Ho una variabile dichiarata ad inizio script, del tipo: d={}
>
>
> poi una routine la modifica, ovviamente ha lo stesso nome all'interno
> della funzione che non riceve () e non restituisce nulla con return.
>
> All'uscita da questa funzione tuttavia, mi ritrovo d intatta, come se
> non avessi apportato alcuna modifica.
>
>
> Come si indaga su un problema di questo genere? Io non riesco a trovare
> l'inghippo.
>
>
> Grazie per il vostro sempre illuminante aiuto.
>
>
> Gabry.
>
>
> --
> --... ...--  -.. .  .. --.. - .- .--. ..-  - ..-  . .
> Sent from TB on Windows 10, Genus Bononiae's computer.
>
> ___
> Python mailing list
> Python@lists.python.it
> https://lists.python.it/mailman/listinfo/python



-- 
 THE -WARE LICENSE (Revision ㊷):
 wrote this . As long as you retain this notice you can
do whatever you want with this stuff. If we meet some day, and you
think this stuff is worth it, you can buy me a  in return. — Carlo
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python